用圖論解決
核心問題是,如何構造出圖,轉換成資料結構
https://math.stackexchange.com/questions/344158/wolves-and-chicks-puzzle
(Too long for a remark.) By the way, one can visualize all possible moves by transforming the puzzle into a graph problem:

The xx and yy axes represent respectively the number of chickens and the number of wolves on the left side of the river. Black arrows signifies a move from the left side to the right side, and red arrows represent trips in opposite direction. We start at (3,3)(3,3). The goal is to reach (0,0)(0,0) by a path interlaced by black and red arrows. It is not hard to see that, somehow the path must contain the subpath (3,1)→(1,1)→(2,2)→(0,2)(3,1)→(1,1)→(2,2)→(0,2).
https://zhuanlan.zhihu.com/p/90131268
在下圖中,紅色線段表示船在左側,藍色線條表示船在右側。
船每經過一個頂點,其就會在左側與右側之間交換位置。也就是說路徑是在紅藍交替的。
錯誤答案
一人帶着3條狼和3頭羊過河,船一次隻能坐一人加兩隻動物,
如狼的隻數超過了或者等于羊的數量,狼會吃掉羊,隻有羊的隻數超過了狼或者主人在,狼才不會吃羊,
主人傳回時至少需要帶一隻動物。
????????????????????????
1:先帶兩隻狼過對面,然後帶一隻狼回來;(這時三隻羊還在這邊)
先帶兩隻狼過對面
????????
????????????????
然後帶一隻狼回來
????
???? ????????????????
2:帶一隻狼和羊過對面,然後把那隻羊帶回來。(這時兩隻狼在對面)
帶一隻狼和羊過對面
???????????? 這裡就完蛋了
???? ????????
然後把那隻羊帶回來
????????
???? ????????????
3:帶兩隻羊過對面,然後帶一隻狼回來。(這時對面有兩隻羊和一隻狼)
帶兩隻羊過對面
???? ????
????????????
???????? ????
4:帶一隻羊和一隻狼到對面,然後帶一隻狼回來。(這時對面有三隻羊和一隻狼)
帶一隻羊和一隻狼到對面
???????????????? ????
????
???????????? ????
5:最後把兩隻狼帶到對面,就全部都過來了!!!
???????????????????? ????
傳教士與吃人惡魔的問題
問題描述
有三個傳教士和三個吃人惡魔要渡過一條河,河中有一條船,隻能裝下兩個人。
在任何地方(無論是岸邊還是船上),如果吃人惡魔數量多于傳教士數量,吃人惡魔就會吃掉傳教士。
問:怎麼才能讓這些都安全過河?
羊狼LR羊狼,需要進行連線處理,一共有10個狀态是正常的
00LR33 , 01,isValid = True
30LR03 , 04,isValid = True
01LR32 , 05,isValid = True
11LR22 , 06,isValid = True
31LR02 , 08,isValid = True
02LR31 , 09,isValid = True
22LR11 , 11,isValid = True
32LR01 , 12,isValid = True
03LR30 , 13,isValid = True
33LR00 , 16,isValid = True
初始狀态是16,左邊33,右邊00
終止狀态是01,左邊00,右邊33
還是用連邊圖比較友善
不過按照下面的方法,需要構造轉移狀态的話,可能需要一個六維向量,然後進行建構
圖論與渡河問題
下面見證奇迹的時候到了,這玩意怎麼和圖論沾上關系呢!
我們隻需要将這些可行狀态看作節點就可以了,有人說:“不對,圖論還有邊呢,你這個圖的邊在哪裡?”
不要慌,請看下面。
我們來構造轉移狀态,我們也用一個四維向量來表示轉移狀态,轉移狀态表示在目前這一步中,有那幾樣東西(人)在渡河。我們用1表示渡河,用0表示不渡河。同樣的,在[y1,y2,y3,y4]中,y1表示人,y2表示狼,y3 表示羊,y4表示蔬菜。因為y1(人)每次都要劃船.是以y1=1恒成立,例如[1,1,0,0]表示人帶着狼從河的一邊到另一邊。
模拟渡河的過程需要用到異或運算:即0+0=0,1+0=1,0+1=1,1+1=0。對于0+0=0,第一個0表示此物的可行狀态,第二個0表示此物的轉移狀态,這個算式的意思是:
在彼岸(0)的物體在這一次運輸中沒有上船(0),結果0表示這個東西還在彼岸。
1+0=1表示此岸(1)的東西沒上船(0),結果還在此岸(1)。
0+1=1表示彼岸(0)的東西上了船(1),到達了此岸(1)
1+1表示此岸(1)的東西上了船(1)。到達了彼岸(0)。
哈哈哈,現在,圖的節點和邊都有了。隻需要畫出這個圖了。然後根據這個圖找出[1,1,1,1]到[0,0,0,0]的最短路徑,就可以了。找出最短路徑可以用一個簡單的工具箱:graphshortestpath()。
在這裡留下一道課後題:有三隻母獅子帶着她們的小獅子過河。三隻母獅子都會劃船,三隻小獅子隻有一個會劃船。船一次隻能帶兩隻獅子,當母獅子與自己的小獅子分開時。别的母獅子會吃掉這個小獅子。請問:這些獅子應該怎麼過河?
Now, here’s the solution:
Send two Quilboars. Return with one Quilboar.
Send two Quilboars. Return with one Quilboar.
Send two Orcs. Return with one Orc & one Quilboar.
Send two Orcs. Return with one Quilboar.
Send two Quilboars. Part 2 of the puzzle is finished!
第0步
左邊????????????????????????
右邊是空的
Send two Quilboars. 第一步,左邊往右邊運送兩隻狼,下面是結果
????????????????
???????? 船在右邊
Return with one Quilboar. 第二步,右邊往左邊運送一隻狼,下面的結果
???????????????????? 船在左邊
Send two Quilboars. 第三步,左邊往右邊運送兩隻狼,下面的結果
???????????? 船在右邊
Return with one Quilboar. 第四步,右邊往左邊送一隻狼,下面的結果
???????????????? 船在左邊【和第一步的差別是,第一步船在右邊,這裡船在左邊】
????????
Send two Orcs. 第五步,左邊往右邊送兩隻羊,下面的結果
???????????????? 船在右邊
Return with one Orc & one Quilboar. 第六步,右邊往左邊送一隻狼和一隻羊,下面的結果
???????????????? 船在左邊
Send two Orcs. 第七步 左邊往右邊送兩隻羊,下面的結果
???????????????? 船在右邊
Return with one Quilboar. 第八步 右邊往左邊送一隻狼,下面的結果
???????????? 船在左邊
Send two Quilboars. 第九步,左邊往右邊送兩隻狼,下面的結果
???????????????????? 船在右邊
Return with one Quilboar. 第十步,右邊往左邊送一隻狼,下面的結果
???????? 船在左邊
Send two Quilboars. 第十一步,左邊往右邊送兩隻狼,下面的結果
左邊空了
???????????????????????? 船在右邊
Part 2 of the puzzle is finished!