過河問題的圖論解法


 有一個人帶着一條狗、一只兔子、一籃白菜來到河邊。河水很深,已經齊半腰,所以他每次只能帶一樣東西過河。但是當人不在時,狗要咬兔子,兔子要吃白菜,請問他該怎樣過去?

當然我們用常用的方法也能解出來,但是考慮到通用性,我們還是用圖論的方法解決。

首先我們將四個對象在河的兩邊分別的所有可能的狀態列舉出來(因為只有人能夠划船,所以在河中間的過程不用考慮),那么四個對象可能的狀態就是2^4=16種,我們用ABCD分別代表人、狗、兔子和白菜,他們分別是
/|ABCD
A|BCD, B|ACD, C|ABD, D|ABC,
AB|CD, AC|BD, AD|BC, BC|AD, BD|AC, CD|AB
ABC|D, ABD|C, ACD|B, BCD|A
ABCD|/
其中|表示河,/表示沒有。顯然上面有些是不滿足要求的,比如A|BCD,BCD|A
, AB|CD,AD|BC, BC|AD, CD|AB,BCD|A都是不滿足要求的(因為出現人不在跟前而有相克的東西在一起)。去掉這些后剩下的可行狀態就是
/|ABCD
 B|ACD, C|ABD, D|ABC,
AC|BD, BD|AC,
ABC|D, ABD|C, ACD|B,
ABCD|/
然后再根據上面的狀態,看看哪些狀態是“相鄰”的,也就是通過人的一次划船能否從一個狀態過渡到另外一個狀態,比如/ABCD與AC|BD就相鄰,因為/ABCD + AC=AC|BD(我們用+來表示從河岸右邊划船到河岸的左邊)。我們考慮所有的聯系,如果“相鄰”我們就將這兩種狀態用一條連線將他們聯系起來,於是我們得到下面的圖





這樣我們就將上面的的所有狀態構造了一個圖。顯然我們就可以用圖論中的Dijkstra算(當然因為邊的權都是1,所以用肉眼看就OK了)得到最短路徑(過河的最少步驟)。答案就不寫了,大家看着辦把。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



微軟過橋問題的圖論解法 過河問題(貪心) 【算法編程】過河問題 袋鼠過河問題 過河問題編程 青蛙過河問題 野人過河問題 過河送電筒問題 ny 47 過河問題 RQNOJ過河卒問題
 
粤ICP备14056181号  © 2014-2021 ITdaan.com