HDU - 1181 變形課(dfs)

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
 

Recommend
JGShining
 

題意:從一堆咒語裏面挑出一個能使b變爲m的串,就是說,先找b開頭的單詞,再找以這個單詞尾字母爲首字母的單詞,直到找到的尾字母爲m

其實就是一種單詞接龍,能完成輸出yes.,不能完成輸出no.(注意後邊的點)

我用的DFS搜索,因爲也不需要最少步數找到,就是問你能不能,所以DFS應該好想一些。

具體做法見代碼註釋:


#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1000+10;
bool vis[maxn];
int n;      //單詞數量。
char s[maxn][maxn];
int flag;
void dfs(char c[])
{
    int end=strlen(c)-1;//字符串結尾標記 爲了增加代碼可讀性
    if(c[end]=='m')
    {
        flag=1;
        return ;        //如果搜到的某個字符串結尾是m flag記爲1 搜索結束
    }
    for(int i=0;i<=n;i++)
    {
        if(c[end]==s[i][0]&&vis[i]==false)  //如果這個單詞的結尾和某個單詞的頭是一樣的
        {
            vis[i]=true;                    //標記爲已走過 接着搜索下一個單詞
            dfs(s[i]);
        }
    }
    return;
}

int main()
{
    int i=-1;
    while(scanf("%s",s[++i])!=EOF)
    {
        flag=0;
        memset(vis,false,sizeof(vis));//初始化判斷數組
        if(strcmp(s[i],"0"))          //只要輸入的不是0 就接着輸入
            continue;
        n=i-1;
        for(int i=0;i<=n;i++)         //遍歷這些字符串 如果首字母是b 標記爲已搜索 開始搜索
        {
            if(s[i][0]=='b')
            {
                vis[i]=true;
                dfs(s[i]);
            }
        }
        if(flag==1)printf("Yes.\n");
        else printf("No.\n");
        i=-1;
    }
    return 0;
}





發佈了28 篇原創文章 · 獲贊 7 · 訪問量 5293
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章