变形课
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 44 Accepted Submission(s) : 10
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. [hint]Hint[/hint] Harry 可以念这个咒语:"big-got-them". C语言程序代码#include<stdio.h> #include<string.h> #include<math.h> int k; int a[26][26],b[26][26]; void dfs(int x) { int i; if(k) return ; for(i=0;i<26;i++) { if(a[x][i]&&b[x][i]==0) { b[x][i]=1; if(i=='m'-'a') { k=1; return ; } dfs(i); b[x][i]=0; } } } int main(){ char s[100]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); k=0; int x,y,xb=0,xm=0; while(scanf("%s",s)!=EOF) { if(strcmp(s,"0")==0) { if(xb&&xm) dfs(1); else k=0; if(k) printf("Yes.\n"); else printf("No.\n"); xb=0;xm=0; k=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); } else { x=s[0]-'a'; if(x==1) xb=1; y=s[strlen(s)-1]-'a'; if(y=='m'-'a') xm=1; if(x!=y) a[x][y]=1; } } return 0; }/*大神的代码*/#include<iostream> #include<cstring> using namespace std; const int N=26; int map[N+1][N+1]; bool visited[N+1]; char s[50]; int flag,d=12; //始点是1(b),终点是12(m) void dfs(int s){ if(s==d) flag=1; if(flag==1) return ; for(int i=0;i<N;i++){ if(map[s][i] && !visited[i]) { visited[i]=1; dfs(i); visited[i]=0; } } return ; } int main(){ int len,a,b; while(cin>>s) { if(s[0]=='0') continue; memset(map,0,sizeof(map)); memset(visited,0,sizeof(visited)); while(s[0]!='0') { len=strlen(s); a=s[0]-'a'; b=s[len-1]-'a'; //将a--z转化为数字保存 map[a][b]=1; scanf("%s",s); } flag=0; visited[1]=1; //始点 dfs(1); if(flag==1) printf("Yes.\n"); else printf("No.\n"); } return 0; } /*看了上面大神的代码,半天才看懂,感觉很精妙*/#include<stdio.h> #include<string.h> int a[27][27],b[27]; int flag,n,d=12;// d为尾子母表示的数12. void dfs(int x) { int i; if(x==d) flag=1; if(flag==1) return ; for(i=0;i<27;i++) { if(a[x][i]&!b[i]) //a[x][i]中X为首字母,i为尾子母,b[i]是对尾子母的标记 { b[i]=1; dfs(i); b[i]=0; } } return ; } int main(){ char s[101]; int l,x,y; while(scanf("%s",s)!=EOF) { if(s[0]=='0') continue; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); while(s[0]!='0') { l=strlen(s); x=s[0]-'a';y=s[l-1]-'a'; a[x][y]=1;//将首尾字母提出存放到数组中 scanf("%s",s); } flag=0; b[1]=1;//尾子母为b的标记为1 dfs(1);//从首字母为b(值为1)的开始找 if(flag) printf("Yes.\n"); else printf("No.\n"); } return 0; }