狼羊過河問題


用圖論解決

核心問題是,如何構造出圖,轉換成數據結構

 

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!

 

  • 🐺🐏🐏🐏
  • 🐺🐺🐺


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM