过河问题的图论解法

 有一个人带着一条狗、一只兔子、一篮白菜来到河边。河水很深,已经齐半腰,所以他每次只能带一样东西过河。但是当人不在时,狗要咬兔子,兔子要吃白菜,请问他该怎样过去?

当然我们用常用的方法也能解出来,但是考虑到通用性,我们还是用图论的方法解决。

首先我们将四个对象在河的两边分别的所有可能的状态列举出来(因为只有人能够划船,所以在河中间的过程不用考虑),那么四个对象可能的状态就是2^4=16种,我们用ABCD分别代表人、狗、兔子和白菜,他们分别是
/|ABCD
A|BCD, B|ACD, C|ABD, D|ABC,
AB|CD, AC|BD, AD|BC, BC|AD, BD|AC, CD|AB
ABC|D, ABD|C, ACD|B, BCD|A
ABCD|/
其中|表示河,/表示没有。显然上面有些是不满足要求的,比如A|BCD,BCD|A
, AB|CD,AD|BC, BC|AD, CD|AB,BCD|A都是不满足要求的(因为出现人不在跟前而有相克的东西在一起)。去掉这些后剩下的可行状态就是
/|ABCD
 B|ACD, C|ABD, D|ABC,
AC|BD, BD|AC,
ABC|D, ABD|C, ACD|B,
ABCD|/
然后再根据上面的状态,看看哪些状态是“相邻”的,也就是通过人的一次划船能否从一个状态过渡到另外一个状态,比如/ABCD与AC|BD就相邻,因为/ABCD + AC=AC|BD(我们用+来表示从河岸右边划船到河岸的左边)。我们考虑所有的联系,如果“相邻”我们就将这两种状态用一条连线将他们联系起来,于是我们得到下面的图





这样我们就将上面的的所有状态构造了一个图。显然我们就可以用图论中的Dijkstra算(当然因为边的权都是1,所以用肉眼看就OK了)得到最短路径(过河的最少步骤)。答案就不写了,大家看着办把。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值