hdoj - 1181 变形课
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".
Harry 可以念这个咒语:"big-got-them".
需要注意的是测试用例需要多次输入(不能写成只能输入一次),还有是题目中每行输入的单词,只和单词的首尾字母有关,所以建个结构体数组(这是网上看的,很强,佩服),只存首尾字母,然后深度搜索即可。
#include <iostream> #include <cstdio> #include <cstring> using namespace::std; int a[1000]; int biaoji=0,len; struct mag{ char head; char end; }map[1000]; void dfs(char s) { if(s == 'm') { biaoji = 1; return ; } for(int i = 0;i<len;i++) { if(a[i] == 0 && map[i].head == s) { a[i] = 1; dfs(map[i].end); if(biaoji == 1) { break; } a[i] = 0; } } } int main() { char str[10]; int i; while(~scanf("%s",&str)) //需要多次输入测试用例加的循环 { if(str[0] == '0') continue; i=0; biaoji = 0; map[i].head = str[0]; map[i].end = str[strlen(str)-1]; i++; while(scanf("%s",&str) && str[0] != '0') { map[i].head = str[0]; map[i].end = str[strlen(str)-1]; i++; } len = i; for(int j = 0;j<i;j++) { if(map[j].head == 'b') { a[j] = 1; dfs(map[j].end); a[j] = 0; } if(biaoji == 1) { break; } } if(biaoji == 1) { printf("Yes.\n"); }else { printf("No.\n"); } } return 0; }