很不错的一道搜索题,思路是讲每个单词的首尾单词找出来,用ans[x][y]数组进行标记,表示从x-----y存在,还必须要有b开头的字母,所以要进行判断。并将字母转化为数字处理,看起来更熟悉。
#include<iostream>
#include<cstdio>
#include<cstring>
#include <memory>
using namespace std;
#define max 27
bool ans[max][max];
char a[300];
bool dfs(int x,int y)
{
if(y==12) {return true;}
for(int i=0;i<=26;i++)
{
if(ans[y][i])
{
ans[y][i]=false; //标记走过
if(dfs(y,i)) return true;
ans[y][i]=true; //回溯
}
}
return false;
}
int main()
{
int flag=0;
memset(ans,false,sizeof(ans));
while(scanf("%s",a)!=EOF)
{
int i;
if(a[0]=='0')
{
if(flag==0) break;
for( i=0;i<=26;i++)
{
if(ans[1][i])
{
ans[1][i]=false;
if(dfs(1,i))
{
printf("Yes.\n");
break;
}
}
}
if(i==27) printf("No.\n");
memset(ans,false,sizeof(ans));
flag=0;
}
else
{
flag=1;
int len=strlen(a);
int x=a[0]-'a';
int y=a[len-1]-'a';
ans[x][y]=true;
}
}
return 0;
}