• [ACM] 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".
     

    Source


    解题思路:

    给出一堆单词,看能不能找到 一个或几个单词相连,使得首字母为b,末字母为m,假设能够输出YES,否则NO。 假设几个单词相连,要求相邻单词首末字母同样,如 big got them.思路是建立状态表,边输入边建立表。 比方单词ab,则c[0][1]=1。输入结束后,初步的表建立完毕,那么连接单词,就要查找,依据状态表。找以b开头的单词,b-a,b-c,b-d.....z。最多找25次。找到一个break调,比方找到了a,然后再找以a开头的单词,循环26次,假设找到,比方c,那么状态表上则连接起来,c[1][0]=1 c[0][3]=1 c[1][3]=1 。最后所有查找完。仅仅要推断c[1][12]的状态就能够了,是1则YES。否则NO。

    代码:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    bool c[30][30];
    bool vis[26];
    char s[100][100];
    bool ok;
    
    int main()
    {
        while(scanf("%s",s[1])!=EOF)
        {
            if(s[1][0]=='0')
            {
                cout<<"No."<<endl;
                continue;
            }
            ok=0;
            memset(c,0,sizeof(c));
            memset(vis,0,sizeof(vis));
            c[s[1][0]-'a'][s[1][strlen(s[1])-1]-'a']=1;
            int i=2;
            while(scanf("%s",s[i])&&s[i][0]!='0')
            {
                c[s[i][0]-'a'][s[i][strlen(s[i])-1]-'a']=1;//建立表
                i++;
            }
            vis[1]=true;
            int j,k;
            for(int i=0;i<25;i++)
            {
                for(j=0;j<26;j++)//找b->连接某个单词 仅仅能是(a,c,d,e.....z),所以外层循环i跑25次就能够了
                {
                    if(!vis[j]&&c[1][j])//寻找和b相连的字母,能够是给出的单词。也能够是后面连接的单词
                    {
                        vis[j]=1;
                        break;
                    }
                }
                if(j==26||c[1][12])
                    break;
                for(k=0;k<26;k++)
                {
                    if(!vis[k]&&c[j][k])
                        c[1][k]=1;//连接单词,连接状态ba as bs
                }
            }
            if(c[1][12])
                cout<<"Yes."<<endl;
            else
                cout<<"No."<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    常见三种字符编码的区别:ASCII、Unicode、UTF-8
    字节、字、bit、byte的关系
    SQLite 3 中的数据类型
    关于线程安全和可重入的区别
    线程安全与可重入
    c++中const变量定义与头文件包含的有关问题
    extern "C"的用法解析
    gVim for windows 简单使用教程
    函数对象
    Qt核心剖析:信息隐藏
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5377860.html
Copyright © 2020-2023  润新知