标签:
【题目描述 - Problem Description】
呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
【输入 - Input】 |
【输出 - Output】 |
测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束. |
如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号) |
【输入样例 - Sample Input】 |
【输出样例 - Sample Output】 |
so soon river goes them got moon begin big 0 |
Yes. |
【题解】
了解题目意思,这题就好做多了。
给你一堆单词(字符串?),首尾相同的可以互相拼接,最后看看是否有 b** *** *** **m的情况存在。
按题目意思来说b*m也是可以的。好吧,虽然没这个数据。
【代码 C++】
1 #include<cstdio> 2 #include<cstring> 3 #include <vector> 4 struct Point{ 5 char data; 6 bool flag; 7 }add; 8 std::vector<Point> data[26]; 9 bool dfs(int now){ 10 for (int i = 0, j = data[now].size(); i < j; ++i){ 11 if (data[now][i].flag == 0){ 12 if (data[now][i].data == ‘m‘ - ‘a‘) return 1; 13 data[now][i].flag = 1; 14 if (dfs(data[now][i].data)) return 1; 15 data[now][i].flag = 0; 16 } 17 } 18 return 0; 19 } 20 bool read(){ 21 char temp[20]; 22 int i; 23 while (gets(temp)){ 24 if (temp[0] == ‘0‘) return 1; 25 i = temp[0] - ‘a‘; 26 add.data = temp[strlen(temp) - 1] - ‘a‘, add.flag = 0; 27 data[i].push_back(add); 28 } 29 return 0; 30 } 31 int main(){ 32 int i, j, ed; 33 while (read()){ 34 for (i = j = 0, ed = data[1].size(); i < ed; ++i){ 35 data[1][i].flag = 1; 36 if (dfs(data[1][i].data)){ ++j; break; } 37 data[1][i].flag = 0; 38 } 39 if (j) puts("Yes."); 40 else puts("No."); 41 for (i = 0; i < 26; ++i) data[i].clear(); 42 } 43 return 0; 44 }
BFS……懒癌发作
这题数据太水……不然我觉得并查集是A不了的,数据问题。
PS:因为数据太水,这题已经被玩坏了……
1 #include<cstdio> 2 int main(){puts("Yes.\nNo.\nNo.");}
HDU 1181
标签:
原文地址:http://www.cnblogs.com/Simon-X/p/5221959.html