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.
Hint
Hint Harry 可以念这个咒语:"big-got-them".
先输入字符串,用新二维数组C,记录字符串首末字母,C[首字母-'a'][末字母-'a'],并标记为1,找出首字母为b的字符串记录莫字母,然找出以b为首字母的字母串的莫字母为首的字符串,用c[][]标记为1,(a~b,b~c,标记C[a][c]=1),再次寻找以b为首字母的字符串并省略已经找过的字符串。
1 #include<cstdio> 2 #include<string.h> 3 #define M 10000 4 char str[M][M]; 5 int k[M],c[26][26],key[27]; 6 int i,j; 7 int main() 8 { 9 memset(c,0,sizeof(c)); 10 memset(key,0,sizeof(key)); 11 while(scanf("%s",&str[1])!=EOF) 12 { 13 int num; 14 i=1; 15 if(str[1][0] == '0') 16 { 17 printf("No "); 18 continue; 19 } 20 c[str[1][0]-'a'][str[1][strlen(str[1])-1]-'a']=1; 21 while(scanf("%s",&str[++i]) && str[i][0] != '0') 22 { 23 k[i]=strlen(str[i]); 24 c[str[i][0]-'a'][str[i][k[i]-1]-'a']=1; 25 } 26 key[1]=1; 27 for(j = 0 ; j < 25 ; j++) 28 { 29 for(i = 0 ; i < 26 ; i++) 30 { 31 if(!key[i] && c[1][i]) 32 { 33 key[i]=1; 34 break; 35 } 36 } 37 if(i == 12 || i == 26) 38 { 39 break; 40 } 41 for(num= 0 ; num < 26 ; num++) 42 { 43 if(c[i][num] && !key[num]) 44 { 45 c[1][num]=1; 46 } 47 } 48 } 49 if(i == 12) 50 printf("Yes. "); 51 else 52 printf("No. "); 53 } 54 }