狼羊过河问题
用图论解决
核心问题是,如何构造出图,转换成数据结构
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!
- 🐺🐏🐏🐏
- 🐺🐺🐺