变形课

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.

 1 #include <stdio.h>
 2 #include <string.h>
 3 struct node
 4 {
 5  char head, tail;
 6 }c[10000];//用来记录字符串的首字母和最后一个字母
 7 char str[10000];//记录输入的字符串
 8 int used[10000], flag, cnt;//used用来记录该字符串是否已被查找过,flag记录查找结果,cnt记录字符串的个数
 9 void dfs(int x)//利用深搜解决问题,x是首字母为b的字符串的数组下标
10 {
11  if(c[x].tail == 'm')//当找到最后一个字符为m的字符串时,就可以返回了
12  {
13   flag = 1;//用flag记录搜索后的结果,如果找到末字符为m的字符串,令flag=1
14   return ;
15  }
16  for(int i = 0; i < cnt; i++)//查找首字符与上一个字符串的末字符相同的字符串,直到找到末字符为m的字符串为止
17  {
18   if(c[i].head == c[x].tail && !used[i])//找到首字符与上一个字符串的末字符相同且未经查找的字符串,标记,进行下一次查找
19   {
20    used[i] = 1;
21    dfs(i);
22   }
23  }
24 }
25 int main()
26 {
27  int  len;
28  getchar();
29  while(~scanf("%s",str))//先输入一个字符串
30  {
31   cnt = 0, flag = 0;
32   if(str[0] != '0')//如果输入的字符串不为0的话,记录它的首字符和末字符
33 { 34 len = strlen(str); 35 c[cnt].head = str[0]; 36 c[cnt].tail = str[len - 1]; 37 cnt++; 38 } 39 getchar(); 40 while(~scanf("%s",str))//继续输入字符串,直到输入0为止,并记录每一个字符串的首字符和末字符
41 { 42 getchar();//要吸收掉换行符 43 if(str[0] == '0') 44 break; 45 else 46 { 47 len = strlen(str); 48 c[cnt].head = str[0]; 49 c[cnt].tail = str[len - 1]; 50 cnt++; 51 } 52 } 53 for(int j = 0; j < cnt; j++)//查找首字符为b的字符串,找到后,标记,利用深搜查找末字符为m的字符串 54 { 55 if(c[j].head == 'b') 56 { 57 used[j] = 1; 58 dfs(j); 59 } 60 } 61 if(flag) printf("Yes. ");//如果找到末字符为m的字符串,输出Yes.,否则输出No. 62 else printf("No. "); 63 } 64 return 0; 65 }
原文地址:https://www.cnblogs.com/digulove/p/4704870.html