Problem Description
呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
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
Harry 可以念这个咒语:"big-got-them".Source
直接dfs暴力即可。。。
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<math.h> 7 #include<algorithm> 8 #include<queue> 9 #include<set> 10 #include<bitset> 11 #include<map> 12 #include<vector> 13 #include<stdlib.h> 14 #include <stack> 15 using namespace std; 16 #define PI acos(-1.0) 17 #define max(a,b) (a) > (b) ? (a) : (b) 18 #define min(a,b) (a) < (b) ? (a) : (b) 19 #define ll long long 20 #define eps 1e-10 21 #define MOD 1000000007 22 #define N 100 23 #define M 1000 24 #define inf 1e12 25 char s[M]; 26 struct Node{ 27 char st,ed; 28 }node[N]; 29 int flag; 30 int num; 31 int vis[N]; 32 void dfs(int cur){ 33 34 if(node[cur].ed=='m'){ 35 flag=1; 36 return; 37 } 38 for(int i=0;i<num;i++){ 39 if(!vis[i] && node[i].st==node[cur].ed){ 40 vis[i]=1; 41 dfs(i); 42 if(flag) 43 return; 44 vis[i]=0; 45 } 46 } 47 } 48 int main() 49 { 50 while(scanf("%s",s)!=EOF && s[0]!='0'){ 51 flag=0; 52 num=0; 53 int len=strlen(s); 54 node[num].st=s[0]; 55 node[num++].ed=s[len-1]; 56 while(scanf("%s",s)!=EOF && s[0]!='0'){ 57 int l=strlen(s); 58 node[num].st=s[0]; 59 node[num++].ed=s[l-1]; 60 } 61 62 for(int i=0;i<num;i++){ 63 memset(vis,0,sizeof(vis)); 64 if(node[i].st=='b'){ 65 vis[i]=1; 66 dfs(i); 67 if(flag==1){ 68 break; 69 } 70 } 71 } 72 if(flag==1){ 73 printf("Yes. "); 74 }else{ 75 printf("No. "); 76 } 77 } 78 79 return 0; 80 }