天天看點

hdu 1181 變形課 DFS變形課

變形課

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 18231    Accepted Submission(s): 6556

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 Gardon-DYGG Contest 1  

Recommend JGShining   |   We have carefully selected several similar problems for you:   1016  1175  1010  1180  1258  //隻能說做題一定要認真小心,否則隻能大意失荊州,這道題隻要用結構體來存每個字元竄的首字母和末尾的字母,利用深搜的方法,在搜尋完了,要取消标志,但是如果是首字母為‘b‘,的話,就不需要取消,因為這會搜尋完了,絕對不可能是它了,參考代碼如下:  

#include<stdio.h>
#include<string.h>
int w,k;
int v[100010];
struct s
{
	char x,y;
}a[100010];
void dfs(int u)
{
	int i,j;
	//v[u]=1;
	if(a[u].y=='m')
	{
		w=1;
		return;
	}
	else
	{
		for(i=0;i<k;i++)
		{
			if(!v[i]&&a[i].x==a[u].y)
			{
				v[i]=1;
				dfs(i);
				v[i]=0;
			}
		}
	}
}
int main()
{
	char s[10010];
	while(scanf("%s",s)!=EOF)
	{
		int len,i;
		w=k=0;
		if(s[0]=='0')
		{
			printf("No\n");
			continue;
		}
		len=strlen(s);
		a[k].x=s[0];
		a[k].y=s[len-1];
		k++;
		while(scanf("%s",s)!=EOF)
		{
			if(s[0]=='0')
				break;
			len=strlen(s);
			a[k].x=s[0];
			a[k].y=s[len-1];
			k++;
		}
		//memset(v,0,sizeof(v));
		for(i=0;i<k;i++)
		{
			if(a[i].x=='b')
			{
				memset(v,0,sizeof(v));
				v[i]=1;
				dfs(i);
			}
			if(w)
				break;
		}
		if(w)
			printf("Yes.\n");
		else
			printf("No.\n");
	}
}
           
dfs

繼續閱讀