又一條深搜,但是我做的時候根本沒有想到用dfs做,應該是數學模型還沒建立好吧!結果就是只能實現部分功能。我的做法是:由於只用到乙個單詞的首尾兩個字母,所以很自然的想到用結構體來儲存;接著比較所有輸進的單詞(直到出現結束標誌'0'),預設的比較應該是按首字母的字典序公升序排列吧(排序是為了下面操作方便);然後通過for語句找,找乙個首字母為'b'的,找到就儲存這個單詞的尾部, 接著試圖想拿這個單詞的尾部覆蓋首字母是b的那個單詞......但是問題出現了,下乙個迴圈找要怎麼寫?到這裡我就卡機了,我的**是從當前的那個單詞往下找,但是發現會漏了這個單詞前面能夠匹配的情況。例如ca, bc, aw, wt,tm 這種情況本來是有解的,但是由於不能再往前找,所以無解!!另外乙個錯誤就是只能處理不包含相同首字母的情況。
例如這組輸入:
so soon river goes them got moon begin big
儲存的序列:
bn bg gs gt mn rr so sn tm
因為只會搜尋一次,有兩個g的情況,只會處理第乙個g(gs),第二個g(gt,通向結果的道路) 不會再處理,如果gs gt位置互換,那麼是能夠得到結果的。所以我的**存在致命的錯誤啊。
網上看到用傳遞閉包、並查集、dfs做,但前兩種由於我還沒接觸,所以就借鑑人家dfs的做法。
說真的,通過這道題目,我發現我沒真正理解dfs的精髓,之前做的幾道發現是迷迷糊糊做的,具體的遞迴呼叫,棧的結構:後進先出。 真的讓我很難理解。惡補了一下這些知識,再加上那位好好人的師兄majia的超有耐心的教導,算是比較理解了。
1 #include 2 #include3using
namespace
std;45
intn;
6bool visit[100];7
8struct
words
9 word[101
];12
13bool dfs(char
ch)14
27}28return0;
29}3031
intmain()
3244 memset(visit, 0, sizeof
(visit));
45if (dfs('b'
))46 printf("
yes.\n
");
47else
48 printf("
no.\n
"); //
如果找遍所有單詞都沒有找到,就輸出'no'49}
50return0;
51 }
2014.7.21 再寫的(因為搜尋太差了,先把以前沒有做出的,但看別人做對的題目重新做過!!!),想不到沒留意到題目中說的「測試資料有多組」 而wa了幾次。
1 #include 2 #include 3 #include 4 #include 5 #include 6using
namespace
std;78
const
int maxn = 5000 + 10;9
char
s[maxn];
10int
flag, l, vis[maxn];
1112
struct
node
13ball[maxn];
1617
void dfs(char
ch)18
24for (int i = 0; i < l; i++)
2532}33
}3435int
main()
3650 dfs('b'
);51 printf("
%s\n
", flag ? "
yes.
" : "
no."
);52}53
return0;
54 }
hdu1181 變形課(搜尋)
problem description 呃.變形課上harry碰到了一點小麻煩,因為他並不像hermione那樣能夠記住所有的咒語而隨意的將乙個棒球變成刺蝟什麼的,但是他發現了變形咒語的乙個統一規律 如果咒語是以a開頭b結尾的乙個單詞,那麼它的作用就恰好是使a物體變成b物體.harry已經將他所會的...
hdu1181 變形課(搜尋)
problem description 呃.變形課上harry碰到了一點小麻煩,因為他並不像hermione那樣能夠記住所有的咒語而隨意的將乙個棒球變成刺蝟什麼的,但是他發現了變形咒語的乙個統一規律 如果咒語是以a開頭b結尾的乙個單詞,那麼它的作用就恰好是使a物體變成b物體.harry已經將他所會的...
HDU 1181 變形課 廣搜
problem description 呃.變形課上harry碰到了一點小麻煩,因為他並不像hermione那樣能夠記住所有的咒語而隨意的將乙個棒球變成刺蝟什麼的,但是他發現了變形咒語的乙個統一規律 如果咒語是以a開頭b結尾的乙個單詞,那麼它的作用就恰好是使a物體變成b物體.harry已經將他所會的...