HDU 1181 DFS
题目叙述的有问题,咒语应该是以b开头m结尾的,一开始看题意就是看不懂,搜了别人的代码,才发现题意的坑了,在网上看到了了别的解法
貌似构图Floyd算法,不过只是要拿此题练习DFS仅此而已。思路:先找到以b开头的单词在开始搜索,寻找首位相连的单词,输出的时候容易错,
有点坑爹。
View Code
1 #include<cstdio> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #define N 1001 6 7 using namespace std; 8 9 struct Node 10 { 11 char s,e; 12 }; 13 Node list[N]; 14 char s[N]; 15 int vis[N],ok,i; 16 17 void DFS(int num) 18 { 19 int j; 20 if(list[num].e == 'm') 21 { 22 ok = 1; 23 return; 24 } 25 for(j=0; j<i; j++)//找到b后开始继续搜索直到找到m结尾的单词 26 { 27 if(!vis[j] && list[num].e==list[j].s)判断此时的结尾是否等于下一个的开头 28 { 29 vis[j] = 1; 30 DFS(j); 31 } 32 } 33 return ; 34 } 35 36 int main() 37 { 38 int j; 39 40 while(scanf("%s",s) != EOF) 41 { 42 if(s[0] == '0') 43 { 44 printf("NO.\n"); 45 continue; 46 } 47 ok = 0; 48 i = 0; 49 memset(vis,0,sizeof(vis)); 50 while( 1 ) 51 { 52 if(s[0]=='0') break; 53 list[i].s = s[0]; 54 list[i++].e = s[strlen(s)-1]; 55 scanf("%s",s); 56 } 57 for(j=0; j<i; j++) 58 { 59 if(list[j].s=='b') 60 { 61 vis[j] = 1; 62 DFS(j); 63 } 64 } 65 if(ok == 1) 66 printf("Yes.\n"); 67 else 68 printf("No.\n"); 69 } 70 //system("pause"); 71 return 0; 72 }