• hdu 1181 变形课


    Problem Description
    呃......变形课上Harry碰到了一点小麻烦,由于他并不像Hermione那样可以记住全部的咒语而任意的将一个棒球变成刺猬什么的,可是他发现了变形咒语的一个统一规律:假设咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
    Harry已经将他所会的全部咒语都列成了一个表,他想让你帮忙计算一下他能否完毕老师的作业,将一个B(ball)变成一个M(Mouse),你知道,假设他自己不能完毕的话,他就仅仅好向Hermione请教,而且被迫听一大堆好好学习的道理.
     

    Input
    測试数据有多组。

    每组有多行。每行一个单词,仅包含小写字母,是Harry所会的全部咒语.数字0表示一组输入结束.

     

    Output
    假设Harry能够完毕他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)
     

    Sample Input
    so soon river goes them got moon begin big 0
     

    Sample Output
    Yes.
    Hint
    Hint
    Harry 能够念这个咒语:"big-got-them".
     


    记得第一次做这个题什么都不懂。看到别人做出来感觉非常奇妙。后来我听队长说最短路能够做曾经写了最短路的代码。如今学了搜索,最终自己能够做出来了
    题目有点难理解的地方就是 HInt中的了。就是  b能够到另外一个单词,然后那个单词在到m
    不多说了,直接上代码


    最短路的:


    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define  N 300
    #define maxe 1000008
    int dis[N],vis[N],a[N][N];
    
    void fdd()
    {
        int i,temp,j,now;
        memset(dis,maxe,sizeof(dis));
        dis['b']=0;
        for(i=0;i<='z';i++)
        {
            temp=maxe;
            now='b';
            for(j=0;j<='z';j++)
                if(!vis[j]&&dis[j]<temp)
            {
                temp=dis[j];
                now=j;
            }
            if(temp==maxe)
                break;
            vis[now]=1;
            for(j=0;j<='z';j++)
                if(!vis[j]&&a[now][j]<maxe)
                  if(dis[now]+a[now][j]<dis[j])
                     dis[j]=dis[now]+a[now][j];
        }
        if(vis['m'])
            printf("Yes.
    ");
        else
            printf("No.
    ");
    }
    
    int main()
    {
        char c[1007];
        int i;
        while(scanf("%s",c)!=EOF)
        {
            if(c[0]=='0')
            {
                printf("No.
    ");
                continue;
            }
            for(i='a';i<='z';i++)
            {
                vis[i]=0;
                dis[i]=maxe;
            }
            memset(a,maxe,sizeof(a));
            a[c[0]][c[strlen(c)-1]]=0;
            while(scanf("%s",c)!=EOF)
            {
                if(c[0]=='0')
                    break;
                a[c[0]][c[strlen(c)-1]]=0;
            }
            fdd();
        }
        return 0;
    }



    以下是搜索的代码


    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define N 30
    
    int a[N][N];
    int yes;
    
    void dfs(int x)
    {
        if(yes)
            return ;
    
        for(int i=0;i<27;i++)
            if(a[x][i])
        {
            if(i==12) {yes=1;return ;}
            a[x][i]=0;
            dfs(i);
            a[x][i]=1;
        }
    }
    int main()
    {
        int i;
        char c[100];
        while(~scanf("%s",c))
        {
            memset(a,0,sizeof(a));
            a[c[0]-'a'][c[strlen(c)-1]-'a']=1;
    
            while(scanf("%s",c)&&c[0]!='0')
            {
                a[c[0]-'a'][c[strlen(c)-1]-'a']=1;
            }
    
            yes=0;
    
            dfs(1);
    
            if(yes)
                printf("Yes.
    ");
            else
                printf("No.
    ");
        }
        return 0;
    }
    


     

  • 相关阅读:
    【Loj146】DFS序3-树链剖分
    【BZOJ3083】遥远的国度- 树剖-换根
    树链剖分-树剖换根
    c++ 随机生成树
    【HAOI2015】树上操作-树链剖分
    centos修改dns
    HttpClient
    aiax跨域问题
    伪静态
    springboot父子项目
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6859721.html
Copyright © 2020-2023  润新知