HDU 1181 DFS回溯思想

2021-07-08 10:18:58 字數 1517 閱讀 4253

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

0sample output

yes.

首先每次變形的時候開始狀態和結束狀態只和單詞的首字母和尾字母有關

所以我們建立乙個結構體用來儲存第i個單詞的開頭和結尾 以及他是否已經被使用過

然後繼續深度遍歷

具體詳見 dfs基礎

重點在說一下回溯問題

比如在dfs回溯的過程中 回溯是向上的

如果在無圖dfs中

回溯過程中所經歷的節點的狀態應該由已經訪問轉變成未訪問

就像此題 每個單詞的使用位置並沒有規定

所以被回溯過的單詞還可以繼續使用

如果在有圖dfs中

此點已經走過 代表著這個點的所有子節點都不在解的範圍之內

所以只需要將它標記成訪問即可 不需更改

#include

#include

struct node s[1000];

int k;

int flag;

int judge;

int dfs(char a);

int main(void)

if (judge < 2)//如果開始何結束的字母不足2個那麼不可能有

flag = 0;

for (int i = 0; i < k; i++)

s[i].mark = 0;

dfs('b');

if (flag)

printf("yes.\n");

else

printf("no.\n");

}return0;}

int dfs(char a)//和1 - 9 的全排列非常類似

if (flag == 1)

return

1; for (int i = 0; i < k; i++)

}return

0;}

hdu1181 dfs搜尋之變形課

這道題資料據說比較水,除了第一組資料是yes以外,其餘都是no,很多人抓住這點就水過了。當然了,我覺得那樣過了也沒什麼意思。刷oj刷的是質量不是數量。這道題從題目上來看是個不錯的 搜尋題,解法多種多樣,有 dfs,bfs,並查集,dijkstra演算法都能解決。題目中給了很多字串,但是關心的只是字串...

hdu1181 dfs搜尋之變形課

這道題資料據說比較水,除了第一組資料是yes以外。其餘都是no。非常多人抓住這點就水過了。當然了,我認為那樣過了也沒什麼意思。刷oj刷的是質量不是數量。這道題從題目上來看是個不錯的 搜尋題,解法多種多樣,有 dfs。bfs,並查集,dijkstra演算法都能解決。題目中給了非常多字串。可是關心的僅僅...

hdu1181 dfs搜尋之變形課

這道題資料據說比較水,除了第一組資料是yes以外。其餘都是no。非常多人抓住這點就水過了。當然了,我認為那樣過了也沒什麼意思。刷oj刷的是質量不是數量。這道題從題目上來看是個不錯的 搜尋題,解法多種多樣,有 dfs。bfs,並查集,dijkstra演算法都能解決。題目中給了非常多字串。可是關心的僅僅...