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 }

 

posted @ 2012-08-04 11:25  zhongya  阅读(138)  评论(0编辑  收藏  举报