变形课
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 18097 Accepted Submission(s): 6501
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.Harry 可以念这个咒语:"big-got-them".HintHint
AC码
#include<stdio.h>
#include<string.h>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
int i,flag;
const int max=1010;
int used[max];
char str[max];
struct node //定义了一个结构体变量,因为每串字符只有头尾有用
{
char head;
char end;
}a[max];
void dfs(int j)
{
if(flag)return; //找到咒语后,每次往前返值
if(a[j].end=='m')
{
flag=1;
return;
}
for(int x=0;x<i;x++)
{
if(a[x].head==a[j].end&&used[x]==0) //因为单词不能重复,所以加上后边的判断
{
used[x]=1; //判断完就要标记已经用过了
dfs(x);
used[x]=0; //如果递归的时候都没有成立的,退一步,把原来的标记清除
}
}
}
int main()
{
i=flag=0;
memset(used, 0, sizeof(used)); //先清零表示都没用过
while(scanf("%s",&str)!=EOF ) //
{
if(str[0] != '0') //不断输入数值直到最后输入的值是0
{
int len = strlen(str);
a[i].head = str[0];
a[i].end = str[len-1];
i++;
}
else
{
for(int j=0;j<i;j++)
{
if(a[j].head=='b')
{
used[j]=1;
dfs(j);
if(flag)break; //让程序更快
}
}
if(flag)
printf("Yes.\n");
else
printf("No.\n");
flag=0; //恢复原来的值,相当于清零
i=0;
memset(used, 0, sizeof(used));
}
}
return 0;
}