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
Hint Harry 可以念这个咒语:"big-got-them".
emmmm说实话这题并不知道为什么要开标记 但是dfs几乎都有怎么个步骤 第一次 时间超限了 因为没有判断读到文件尾结束 我做dfs用的都是递归思想 因为栈学的实在不好 这题要注意的是其实判断只是开头字母和最后一个字母 所以把他们存在二维数组
#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char a[100][2];
int v[100];
int dfs(int n,int j)
{
int i;
if(a[j][1]=='m')
return 1;
for(i=0; i<n; i++)
{
if(a[i][0]==a[j][1]&&v[i]!=1)
{
v[i]=1;
if(dfs(n,i))
return 1;
}
}
return 0;
}
int main()
{
char b[1000];
int str;
int n,i=0,j;
while((scanf("%s",b))!=EOF)
{
memset(v,0,sizeof(v));
i=0;
if(strcmp(b,"0")!=0)
{
n=strlen(b);
a[i][0]=b[0];
a[i][1]=b[n-1];
i++;
}
if(strcmp(b,"0")==0)
continue;
while(1)
{
scanf("%s",b);
if(strcmp(b,"0")!=0)
{
n=strlen(b);
a[i][0]=b[0];
a[i][1]=b[n-1];
i++;
}
if(strcmp(b,"0")==0)
{
for(j=0; j<i; j++)
{
if(a[j][0]=='b')
{
v[j]=1;
str=dfs(i,j);
if(str==1)
{
cout<<"Yes."<<endl;
break;
}
}
}
if(j==i&&str==0)
{
cout<<"No."<<endl;
break;
}
}
}
}
return 0;
}