狼羊过河问题

用图论解决

核心问题是,如何构造出图,转换成数据结构

 

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!

 

  • 🐺🐏🐏🐏
  • 🐺🐺🐺
posted @ 2021-05-07 21:53  ChuckLu  阅读(2971)  评论(0编辑  收藏  举报