变形记

题目描述

呃…变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
输入
测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.
输出
如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)

分析:

本题其实如果读懂题意,也就是简单的深搜,(回溯是深搜的一个必备条件)。我们如题意可知,对于每个字符串,我们只需要考虑,第一个和最后一个字母就可以了。因此,我们确实也只需要保存,这两个字母。
代码如下:

#include"stdio.h"
int n;
char a[100][2];
int dp[100];//保存当前这个字符串是否已经被使用过。
int dfs(char t)//核心代码
{ int i,j;
    if(t=='m')//找到m返回真值
        return 1;
    for(i=0;i<n;i++)//从第一个字符串开始依次到最后一个字符试试
    {
        if(dp[i]==1&&t==a[i][0])//当前字符串可以转变
        {  dp[i]=0;//表当前字符串已使用
            t=a[i][1];//t的值发生改变,记住在后续操作中,要改回来
            if(dfs(t)==1)//代表已经找到则直接返回就好了
                return 1;
          dp[i]=1;//赋值为1.把这一个字符串重新释放,未被使用过了
          t=a[i][0];//t的值要改回来

        }
    }
  return 0;
}
int main()
{
   char p[100],b='b';
   char pp;
   int i,j,k,l;
   while(~scanf("%s",p))//这为输入。对于字符串的输入都还是要注意以下最后一个换行符
   {   scanf("%c",&pp);
       if(p[0]=='0')
          continue;
       l=strlen(p);
       a[0][0]=p[0];
       a[0][1]=p[l-1];
       n=1;
       dp[0]=1;
       while(1)
       {
           scanf("%s",p);
           scanf("%c",&pp);
           if(p[0]=='0')
              break;
           l=strlen(p);
           a[n][0]=p[0];
           a[n][1]=p[l-1];
           dp[n]=1;
           n++;
       }
   //    printf("%d\n",n);
 /*  for(i=0;i<n;i++)
   {
       printf("%c %c\n",a[i][0],a[i][1]);
   }*/
       if(dfs(b)==1)
          printf("Yes.\n");
       else
          printf("No.\n");

   }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/84312602