变形课Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 32928 Accepted Submission(s): 11784 Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
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".
|
思路:
//咒语必须是像成语接龙一样,前一个单词的尾字母是下一个单词的首字母
//必须满足整个咒语的第一个单词是B开头,M结尾的
//原来想着用 char s[10001][10001];来存储每个单词,但是发现这样无法得知每个单词的最后一个字母
注意:
1.要写好输入单词的算法,并且用First、End数组分别存储好每一个单词的首字母和尾字母
2.不能用end作为数组名提交,会出现重名错误
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//咒语必须是像成语接龙一样,前一个单词的尾字母是下一个单词的首字母
//必须满足整个咒语的第一个单词是B开头,M结尾的
//原来想着用 char s[10001][10001];来存储每个单词,
//但是发现这样无法得知每个单词的最后一个字母
//不能用end[]提交 会重名
int flag;
int n;
char First[1001],End[1001];
int vis[1001];
void dfs(char ch)
{
if(flag)
return ;
if(ch=='m')
{
flag=1;
return ;
}
for(int i=0;i<n;i++)
{
if(!vis[i] && First[i]==ch)
{
vis[i]=1;
dfs(End[i]);
vis[i]=0;
}
}
return ;
}
int main()
{
char c;
while( (c=getchar())!=EOF )
{
n=0;
while(1)
{
if((c-'0')==0)
{
getchar();
break;
}
First[n]=c; //存储每个单词的首字母
while((c=getchar())!='\n') //将尾字母存储的关键代码
{
End[n]=c;
}
n++;
c=getchar(); //获取下一个单词的首字母
}
flag=0;
if(n==0)
break;
for(int i=0;i<n;i++) //先把首元素为b的找出来呀
{
if(First[i]=='b')
{
memset(vis,0,sizeof(vis));
// vis[i]=1; //不能要这步
dfs(First[i]);
}
if(flag)
break;
}
if(flag)
printf("Yes.\n");
else
printf("No.\n");
}
return 0;
}