修道士过河问题

原创 2002年03月22日 17:40:00


设有m个野人,n个修道士,(m≤n)船上可坐c个人。
1. c=1,无解;
2. c=2,对较小的M,N有解,对于较大的M,N无解,比如m=n=4,c=2无解;
3. c=3,情况同上;
4. c>3,分情况讨论如下:
(1) m=n,
此时可以按照下面的方案设计(下面S表示野人savage,R表示修道士religious, B表示船boat, ||表示河)
方案一:

m S ||      (m-c)S || cS        (m-c+1) S  || (c-1) S      (m-c+1)S || (c-1)S       (m-c+2)S || (c-2)S
m R ||  =>     m R ||       =>        m R  ||          =>  (m-c+1)R || (c-1)R   =>  (m-c+2)R || (c-2)R
B   ||             ||  B                B  ||                       ||      B              B ||

于是又回到了开始时候的情况,两岸的S,R相等且船在左岸,已经有c-2个S和c-2个R过了河。依次做下去,最终所有的人都会过河;
还有一种方案:
方案二:
mS ||     (m-[c/2])S || [c/2]S       (m-[c/2]+1)S || ([c/2]-1)S
mR ||  => (m-[c/2])R || [c/2]R   =>  (m-[c/2]+1)R || ([c/2]-1)R
 B ||                ||      B                  B ||
 最终也会到两岸S,R相等而船在左岸的情况,有[c/2]-1个S和R过了河。
 
 当c为偶数时,方案一和方案二的过河速度是一样的;当c为奇数时,方案一要比方案二快。
 当m=n时,一些特例需要考虑:
 a. k≥m+n,让所有人一次全部过河;
 b. k≥m, 用上面的方案一;


(2)n>m时,
①n=m+1,又分以下两种情况:
(a) c为偶数,方案如下:

方案三:

mS ||       (m-c)S || cS         (m-c+1)S || (c-1)S         (m-c+1)S || (c-1)S        (m-c+1)S || (c-1)S
nR ||   =>      nR ||       =>         nR ||           =>     (n-c)R ||     cR    =>  (n-c+1)R || (c-1)R
 B ||              ||  B                B ||                         ||      B               B ||

 令m'=m-c+1,n'=n-c+1,则又重复了n'=m'+1的情况;

(b) c为奇数,设c=2h+1,显然a的方案三也可用,另外还有以下方案:

方案四

mS ||        (m-h)S ||     hS         (m-h)S || hS
nR ||   => (n-h-1)R || (h+1)R      => (n-h)R || hR
 B ||               ||      B              B ||   

令m'=m-h,n'=n-h,又回到了n'=m'+1的情况。按照这个方案每次h个S和h+1个R过河,然后1个R回来。

当c为奇数的时候a,b两种方案的过河速度一样。

②n≥m+2时:
(a) c为奇数时,可以用n=m+1的情况b的方案四。

(b) c为偶数时,设c=2h,可以每单次过h-1个S,h+1个R,然后回来一个R,每双次过h个S,h个R,回来一个R.具体如下所示:
方案五:


mS ||      (m-h+1)S || (h-1)S         (m-h+1)S || (h-1)S         (m-2h+1)S || (2h-1)S       (m-2h+1)S || (2h-1)S
nR ||   => (n-h-1)R || (h+1)R      =>   (n-h)R ||     hR    =>     (n-2h)R ||     2hR    => (n-2h+1)R || (2h-1)R
 B ||               ||      B                B ||                          ||       B               B ||

 令m'=m-2h+1, n'=n-2h+1,重复上述过程。

算法设计的总思路是每次过河的人尽可能地多,回来的人尽可能地少,当n>m,c≥2的时候总是有解。

上述的算法已经说的很清楚了,程序你应该可以自己写出来吧。

这个问题是NOI复赛考过的题目,题目不难,但是要注意讨论全面。

修道士和野人过河问题 A*算法 人工智能

/** * 2014-08-25 by Liy * 修道士和野人过河问题,一共有3个修道士和3个野人,1条船 * 1、船最多可乘坐2人 * 2、两岸边 野人的数量不能多于修道士的数量,...
  • yaling521
  • yaling521
  • 2014年08月25日 19:47
  • 2231

修道士与野人问题——C++源代码,伪代码,详细分析

前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决。
  • u013390476
  • u013390476
  • 2016年01月19日 23:43
  • 2507

C++习题:野人与修道士过河问题

河的左岸有3个野人和3个修道士以及一条小船,修道士们想用这条小船把所有的人都运到河的右岸,但又受到以下限制: 1、修道士和野人都会划船,但船一次只能载2人; 2、在任何岸边,野人数不能超过修道士数,否...
  • iamshaofa
  • iamshaofa
  • 2013年12月03日 08:53
  • 3362

递归问题——以全排列、青蛙过河问题为例

一、递归的概念       递归函数是一种自身调用自身的函数。递归的基本思想是将规模大的问题转化为规模小的相似的子问题来解决。例如,我们可以将一个大洋葱看成一个带着一层洋葱皮的小洋葱,要剥开这个...
  • hfutdog
  • hfutdog
  • 2017年07月20日 13:07
  • 483

农夫过河问题(图的邻接矩阵)

/******************************************************************************* *农夫过河问题(图的邻接矩阵存储,深度...
  • qq_23693629
  • qq_23693629
  • 2015年11月12日 22:11
  • 778

NYOJ45:过河问题【贪心】

过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论...
  • lin14543
  • lin14543
  • 2015年08月10日 15:24
  • 1113

360笔试题2013:牧师(传道士)与野人过河问题

文章转自:点击打开链接。在开头写上原创是由于我觉得绿色的标题比转载的灰色标题显眼(个人爱好),如果有对原作者冒犯,在此道歉。 编程题、传教士人数M,野人C,M≥C,开始都在岸左边, ①船只能载两人,传...
  • leolinsheng
  • leolinsheng
  • 2013年09月08日 21:36
  • 2098

过河问题-狼羊人菜

/* *功能:解决狼羊人过河问题 *作者:王文堃 *作者邮箱:wenkun_wang@163.com *创建时间:2016/4/5 *//* 问题描述:有一个人带着一匹狼、一头羊和白菜要过河 已知人每...
  • Nick_Wang94
  • Nick_Wang94
  • 2016年04月09日 16:13
  • 1675

农夫过河问题

问题描述: 老伯伯要带鱼、狗、猫过河到对岸.,有一条船,只能坐一个人,老伯每次只能带一样动物过河,当老伯不在的时侯狗会咬猫,猫会吃鱼.,请问怎么顺序过河呢? 要求:编写程序,由程序来推出过河的顺序...
  • ddesyt
  • ddesyt
  • 2014年07月24日 15:24
  • 2115

农夫过河问题 简单的搜索

// 用一个二进制串表示状态0,表示东西或者人在河的这边 // 1表示东西或者人在河的另一边 // 比如0000表示都在起始的位置,1111表示都到了对岸 // 通过状态的转移,来找到路径 #inc...
  • TIMELIMITE
  • TIMELIMITE
  • 2015年06月17日 01:03
  • 1417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修道士过河问题
举报原因:
原因补充:

(最多只允许输入30个字)