`
BlogDown
  • 浏览: 213649 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

修道士过河问题

 
阅读更多

设有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复赛考过的题目,题目不难,但是要注意讨论全面。

分享到:
评论

相关推荐

    C语言实现野人与修道士过河问题 源代码

    C语言实现野人与修道士过河问题 源代码

    修道士与野人渡河问题 数据结构

    用三维数组STATE(0:n,0:n,0:n)代表渡河过程中所有状态(合法的和非法的)。STATE(x1,x2,x3)为真,表示该状态已经出现过(“已达”);为假,表示未曾出现过(“未达”)。

    修道士野人问题

    c++实现的修道士野人问题 河的左岸有N个野人和N个修道士以及一条小船,修道士们想用这条小船把所有的人都运到河的右岸,但又受到以下限制:  修道士和野人都会划船,但船一次只能载C人。  在任何岸边,为了防止...

    java实现野人与传教士过河问题

    java实现野人与传教士过河问题,需要c或者c#(有动画演示)见主页。

    修道士与野人问题

    修道士与野人过河问题,包括界面编写。

    人工智能-野人与传教士过河.c

    1.问题重述 在河的左岸有N个传教士、N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制: ...假定野人会服从任何一种过河安排,请规划出一个确保修道士安全过河的计划。

    野人过河问题属于人工智能学科中的一个经典问题

    野人过河问题属于人工智能学科中的一个经典问题

    Java解决“野人传教士过河问题”算法源码

    假设有 N 个传教士和 N 个野人准备渡河,但只有一条能容纳 C 人的小船,1 ,为了防止野人伤害传教士,要求无论在何处,传教士的个数不得少于野人的人数(除非传教士个数为 0)。如果两种人都会划船,试设计一个算法...

    野人与传教士过河问题

    野人与传教士过河问题: 三个传教士与三个野人要从河的左岸渡到右岸,刚好左岸有一只小船,一次最多只能坐两人,在任何时候,河的两岸,如果野人的数量多于传教士的数量,那么野人的恶习会复发,传教士会被吃掉!...

    人工智能prolog语言实验:修道士、野人渡河问题(传教士、野人渡河问题)

    在河的右岸有3个修道士、3个野人和一条船,修道士要把所有人都运到河对岸,但是:...(2)在两个岸边,野人数目不能超过修道士的数目,否则后者被吃掉。野人完全服从修道士的任何渡河方案。 包含prolog代码以及实验报告

    A*算法解决传教士—野人过河问题.zip

    本资源包括A*算法解决传教士—野人过河问题实验报告书以及可运行程序,有着详细的原理介绍和代码注释,适合初学者学习

    人工智能经典作业,野人与传教士过河问题

    传教士与野人过河程序设计问题:设有3个传教士和3个野人来到河边,打算乘一只船从左岸渡到右岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。请用A*算法实现传教士...

    道士过河问题-设计与实现java版

    在河的左岸有三个修道士、三个野人和一条船,修道士们想用这条船将所有人都运到河对岸,但要受以下条件限制: 1、修道士和野人都会划船,...假定野人愿意服从任何一种过河安排,请设计出一种确保修道士安全的过河方案。

    3个传教士与3个野人过河问题

    用回溯法、递归求解 传教士与野人过河问题。

    传教士过河问题.docx

    从前有一条河, 河的右岸有 3 个传教士、 3 个野人和一艘最多可乘 2 人的小 船。 约定左岸, 右岸和船上或者没有传教士, 或者野人数量少于传教士, 否则野 人会把传教士吃掉。 搜索一条可使所有的野人和传教士安全...

    xds.rar_xds_数据结构 源码_过河问题

    数据结构的经典问题,修道士与野人过河 求解步骤 源码

    人工智能报告

    修道士和野人问题。在河的左岸有3个修道士、1条船和3个野人,修道士们想用这条船将所有的成员运过河去,但是受到以下条件的限制: (1)修道士和野人都会划船,但船一次最多只能装运两个; (2)在任何岸边野人数目...

    gide_command.rar_Java_

    用JAVA实现修道士过河

Global site tag (gtag.js) - Google Analytics