Harry已經將他所會的所有咒語都列成了一個表,他想讓你幫忙計算一下他是否能完成老師的作業,將一個B(ball)變成一個M(Mouse),你知道,如果他自己不能完成的話,他就只好向Hermione請教,並且被迫聽一大堆好好學習的道理.
題意:從一堆咒語裏面挑出一個能使b變爲m的串,就是說,先找b開頭的單詞,再找以這個單詞尾字母爲首字母的單詞,直到找到的尾字母爲m
其實就是一種單詞接龍,能完成輸出yes.,不能完成輸出no.(注意後邊的點)
我用的DFS搜索,因爲也不需要最少步數找到,就是問你能不能,所以DFS應該好想一些。
具體做法見代碼註釋:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1000+10;
bool vis[maxn];
int n; //單詞數量。
char s[maxn][maxn];
int flag;
void dfs(char c[])
{
int end=strlen(c)-1;//字符串結尾標記 爲了增加代碼可讀性
if(c[end]=='m')
{
flag=1;
return ; //如果搜到的某個字符串結尾是m flag記爲1 搜索結束
}
for(int i=0;i<=n;i++)
{
if(c[end]==s[i][0]&&vis[i]==false) //如果這個單詞的結尾和某個單詞的頭是一樣的
{
vis[i]=true; //標記爲已走過 接着搜索下一個單詞
dfs(s[i]);
}
}
return;
}
int main()
{
int i=-1;
while(scanf("%s",s[++i])!=EOF)
{
flag=0;
memset(vis,false,sizeof(vis));//初始化判斷數組
if(strcmp(s[i],"0")) //只要輸入的不是0 就接着輸入
continue;
n=i-1;
for(int i=0;i<=n;i++) //遍歷這些字符串 如果首字母是b 標記爲已搜索 開始搜索
{
if(s[i][0]=='b')
{
vis[i]=true;
dfs(s[i]);
}
}
if(flag==1)printf("Yes.\n");
else printf("No.\n");
i=-1;
}
return 0;
}