变形课 简单搜索

来源:互联网 发布:自动配餐王软件 编辑:程序博客网 时间:2024/05/22 17:43

变形课

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 9   Accepted Submission(s) : 5
Problem Description
呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体. Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
 

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

Output
如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)
 

Sample Input
sosoonrivergoesthemgotmoonbeginbig0
 

Sample Output
Yes.[hint]Hint[/hint]Harry 可以念这个咒语:"big-got-them".
 
思路:每个单词的第一个字母可以看作起点,最后一个字母看作终点,可以构图。用BFS看B与M是否是连通的。
代码如下:

BFS:

#include <iostream>#include <cstdio>#include <vector>#include <cstring>#include <queue>using namespace std;vector<int>g[26];int vist[26];void init(){    for(int i = 0; i < 26; i ++)    {        vist[i] = 0;        g[i].clear();    }}void bfs(){    queue<int> q;    q.push('b'-'a');    int u ;    while(!q.empty())    {        u = q.front();        q.pop();        vist[u] = 1;        for(int i = 0; i < (int)g[u].size(); i ++)        {            if(g[u][i] == 'm'-'a'){                printf("Yes.\n");                return ;            }            else if(vist[g[u][i]] == 0)            {                q.push(g[u][i]);            }        }    }    printf("No.\n");}int main(){    char str[100];    int u , v , m;    init();    while(scanf("%s",str)!=EOF)    {        if(str[0] == '0'){            bfs();            init();        }        else{           m = strlen(str);           u = str[0]-'a';           v = str[m-1]-'a';           g[u].push_back(v);        }    }    return 0;}

DFS:

#include <iostream>#include <cstdio>#include <vector>#include <cstring>using namespace std;vector<int>g[26];int vist[26];int flag = 0;void init(){    for(int i = 0; i < 26; i ++)    {        vist[i] = 0;        g[i].clear();    }    flag = 0;}void dp(int s){    if(flag) return ;    if(s == 'm'-'a') {        flag = 1;        printf("Yes.\n");        return;    }    if(vist[s]) return;    vist[s] = 1;    for(int i = 0; i < (int)g[s].size(); i ++)    {        dp(g[s][i]);    }}void dfs(){    vist[1] = 1;    for(int i = 0; i < (int)g[1].size(); i ++)    {        dp(g[1][i]);    }    if(!flag) printf("No.\n");}int main(){    char str[100];    int u , v , m;    init();    while(scanf("%s",str)!=EOF)    {        if(str[0] == '0'){            dfs();            init();        }        else{           m = strlen(str);           u = str[0]-'a';           v = str[m-1]-'a';           g[u].push_back(v);        }    }    return 0;}


1 0
原创粉丝点击