1. 程式人生 > >HDOJ1181變形課 深搜回溯

HDOJ1181變形課 深搜回溯

變形課
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 18474 Accepted Submission(s): 6663

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.

HintHint
Harry 可以念這個咒語:”big-got-them”.

這個程式碼還是很容易理解的,經典的DFS
不過對於沒超時,我感到意外哈
我是從m往b搜尋的

#include<stdlib.h>
#include<stdio.h> #include <string.h> using namespace std; char a[1000][50]; int len[1000]; int k;int flag; bool vis[1000]; void dfs(char x) { if(x=='b') { flag=1; return ; } if(flag==1) { return; } for(int i=0;i<k;i++) { //printf("vis[%d]=%d\n",i,vis[i]);
if(vis[i]==0) { if(a[i][len[i]]==x) { // printf("a[%d][%d]=%c\n",i,len[i],a[i][len[i]]); vis[i]=1; // printf("x=%c\n",x); dfs(a[i][0]); // printf("x=%c\n",x); vis[i]=0; } } } } int main() { while(scanf("%s",a[0])!=EOF) { flag=0; int i=0; if(a[0][0]=='0') { printf("no.\n"); continue; } memset(vis,0,sizeof(vis)); while(a[i][0]!='0') { len[i]=strlen(a[i])-1; i++; scanf("%s",a[i]); } k=i; dfs('m'); if(flag==1) printf("Yes.\n"); else printf("No.\n"); } }

下面這段程式碼是從b往m搜尋的,差不多

#include<stdlib.h>
#include<stdio.h>
#include <string.h>
using namespace std;
char a[1000][50];
int len[1000];
int k;int flag;
bool vis[1000];
void dfs(char x)
{
    if(x=='m')
        {
            flag=1;
            return ;
        }
    if(flag==1)
    {
        return;
    }
    for(int i=0;i<k;i++)
    {
        //printf("vis[%d]=%d\n",i,vis[i]);
        if(vis[i]==0)
        {
            if(a[i][0]==x)
            {
               // printf("a[%d][%d]=%c\n",i,len[i],a[i][len[i]]);
                vis[i]=1;
               // printf("x=%c\n",x);
                dfs(a[i][len[i]]);
               // printf("x=%c\n",x);
                vis[i]=0;
            }
        }
    }
}
int main()
{
    while(scanf("%s",a[0])!=EOF)
    {
        flag=0;
         int i=0;
        if(a[0][0]=='0')
        {
            printf("no.\n");
            continue;
        }
        memset(vis,0,sizeof(vis));
        while(a[i][0]!='0')
        {
            len[i]=strlen(a[i])-1;
            i++;
            scanf("%s",a[i]);
        }
        k=i;
        dfs('b');
        if(flag==1)
            printf("Yes.\n");
        else
            printf("No.\n");

    }
}