用圖論解決
核心問題是,如何構造出圖,轉換成數據結構
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. 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!
- 🐺🐏🐏🐏
- 🐺🐺🐺