hdu 1181 变形课 (深搜)

来源:互联网 发布:淘宝卖家好评的好处 编辑:程序博客网 时间:2024/06/10 02:41

看题目请点这里

题意:

中文题不解释。

根据所给单词,建立一张26x26的地图,0-25分别代表a-z。行数代表单词开头字母,列数代表单词的最后一个字母。

如abcd,开头字母为a,最后一个字母为d,那么让map[0][3]=1,表示该单词存在。

然后根据地图从map[1][i](0<=i<=25)=1的开始搜即可。

代码:

#include<stdio.h>#include<string.h>bool map[26][26]={false},judge[26][26]={false},flag=false;void dfs(int x,int y)   //深搜{if(y=='m'-'a')   //找到m结尾的{flag=true;return ;}if(flag)   //找到满足条件的答案,不必再搜{return ;}int X,i;X=y;   //查找以这个单词最后一个字母开头的单词for(i=0;i<26;i++){if(map[X][i]==1 && judge[X][i]==false){judge[X][i]=true;   //用过,不必再用dfs(X,i);}}}int main(){int i;char s[100];while(scanf("%s",s)!=EOF){if(strcmp(s,"0")==0)   //判断本次输入是否结束{for(i=0;i<26;i++)   //查找以b开头的单词{if(map['b'-'a'][i]==1){judge['b'-'a'][i]=true;   //true表示用过,不必再用dfs('b'-'a',i);if(flag)   //判断深搜是否成功{puts("Yes.");break;}}}if(i==26)   //i=26表示没搜到满足条件的答案{puts("No.");}flag=false;   //数据初始化memset(map,false,sizeof(map));memset(judge,false,sizeof(judge));}else{map[ s[0]-'a' ][ s[ strlen(s)-1 ]-'a' ]=true;   //建立一张地图}}    return 0;}
在搜索之前也可以算算以首字母为b的单词和最后一个字母为m的单词是否都存在来优化一下。

原创粉丝点击