hdu 1181 变形课

来源:互联网 发布:数据库系统原理苗雪兰 编辑:程序博客网 时间:2024/05/16 07:41

很不错的一道搜索题,思路是讲每个单词的首尾单词找出来,用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;
}

原创粉丝点击