题目意思
魔法咒语中假设一个单词以A开头以B结束,就是将A变成B。现在给你很多的单词,让你判断能否将B变成M。如果可以输出Yes,否则输出No。
解题思路
就是一道简单的广搜问题,将所输入的单词先找出B,然后开始搜索是否能过找到M。这里需要注意一下最后的输出。不要忘记输出后还有一个句号,这点小细节很容易忽略导致错误。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
const int s='b'-'a';
const int t='m'-'a';
vector <int> node[30];
int vis[30];///标记数组
char str[1002];
bool bfs()
{
int cur,nex;
queue <int> Q;
Q.push(s);
vis[s]=1;
while(!Q.empty())
{
cur=Q.front();
Q.pop();
if(cur==t)
return true;
for(int i=0; i<node[cur].size(); i++)
{
nex=node[cur][i];
if(vis[nex]==0)
{
vis[nex]=1;
Q.push(nex);
}
}
}
return false;
}
int main()
{
for(int i=0; i<30; i++)
node[i].clear();
while(~scanf("%s",str))
{
if(strcmp(str,"0")==0)///当输入0时开始进行搜索
{
memset(vis,0,sizeof(vis));
bool ans=bfs();
if(ans)
printf("Yes.\n");
else
printf("No.\n");
for(int i=0; i<30; i++)
node[i].clear();
int flag=1;
if(flag)
continue;
}
int from=str[0]-'a';
int len=strlen(str);
int to=str[len-1]-'a';
node[from].push_back(to);
}
return 0;
}