您的位置:首页 > 其它

HDU 1181

2016-04-05 19:07 134 查看
这是一道经典的搜索题,不求最短路,只要求找出有没有通路即可。

首先把输入的单词首尾字母另存在一个数组里,然后设个邻接矩阵,判断是否相连而且遍历过,没有则判断是否到终点,也没有则递归,如果完全走完什么都没有,则不会有通路。

#include<stdio.h>
#include<string.h>
int deep(int s[100][100],int c[100],int k,char b[100][3])
{
int j;
c[k]=1;
for(j=0; j<100; j++)
{

if(s[k][j]==1&&c[j]==0)
{
if(b[j][1]=='m')
return 1;
else if(deep(s,c,j,b))
return 1;
}
}
return 0;
}
int main()
{
int e,k;
char a[100][100],b[100][3],ch;
int i,j,an,c[100],s[100][100];
memset(a,'2',sizeof(a));
memset(b,'2',sizeof(b));
while(scanf("%s",a[0])!=EOF)
{
for(i=1; i<100; i++)
{
scanf("%s",a[i]);

if(a[i][0]=='0')
break;
}
for(i=0; i<100; i++)
{
an=strlen(a[i]);
b[i][0]=a[i][0];
b[i][1]=a[i][an-1];
}
memset(s,0,sizeof(s));
for(i=0; i<100; i++)
for(j=0; j<100; j++)
{
if(b[i][1]==b[j][0])
s[i][j]=1;
else
s[i][j]=0;
}
e=0;
memset(c,0,sizeof(c));
for(i=0; i<100; i++)
{
if(b[i][0]=='b')
{
if(b[i][1]=='m')
{
e=1;
break;
}
k=i;
if(deep(s,c,k,b))
{
e=1;
break;
}
}
}
if(e==1)
printf("Yes.\n");
else
printf("No.\n");
memset(a,'2',sizeof(a));
memset(b,'2',sizeof(b));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: