变形课
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 28226 Accepted Submission(s): 10289
Problem Description
呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
Input
测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.
Output
如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)
Sample Input
so
soon
river
goes
them
got
moon
begin
big
0
Sample Output
Yes.
Harry 可以念这个咒语:"big-got-them".
Hint
Hint分析:
利用结构体储存每个单词的头和尾,然后利用一个标志位数组来确保不重复
1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<string.h> 4 struct world 5 { 6 char end; 7 char begin; 8 } w[1000]; 9 int a[1000],flag,f; 10 void dfs(char c) 11 { 12 int i; 13 if(c=='m') 14 { 15 flag=1; 16 return ; 17 } 18 for(i=0; i<f; i++) 19 { 20 if(a[i]==0&&w[i].begin==c) 21 { 22 a[i]=1; 23 dfs(w[i].end); 24 a[i]=0; 25 } 26 } 27 } 28 int main() 29 { 30 char s[1000]; 31 while(~scanf("%s",s)) 32 { 33 if(!strcmp(s,"0")) 34 continue; 35 int i=0; 36 w[0].begin=s[0]; 37 w[0].end=s[(strlen(s)-1)]; 38 f=0; 39 f++; 40 while(scanf("%s",s),strcmp(s,"0")) 41 { 42 w[f].begin=s[0]; 43 w[f].end=s[(strlen(s)-1)]; 44 f++; 45 } 46 flag=0; 47 for(i=0; i<f; i++) 48 { 49 memset(a,0,sizeof(a)); 50 if(w[i].begin=='b') 51 { 52 a[i]=1; 53 dfs(w[i].end); 54 } 55 if(flag) 56 { 57 break; 58 } 59 } 60 if(flag) 61 { 62 printf("Yes. "); 63 } 64 else 65 { 66 printf("No. "); 67 } 68 } 69 return 0; 70 }