老师布置了一题目 可把全班人考到了 求高手解答

wlbinggniblw 2010-09-19 11:27:10
野人过河问题属于人工智能学科中的一个经典问题,问题描述如下: 有N个牧师(也有的翻译为传教士)和N个野人过河,只有一条船,在河的任何一方或者船上,如果野人的人数大于牧师的人数,那么牧师就会有危险. 你能不能找出一种安全的渡河方法呢?
用一种编程语言实现!最好是C语言!
不甚感激!
...全文
437 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingshaofengbinbin 2010-09-23
  • 打赏
  • 举报
回复
帮顶!!!
wizard_tiger 2010-09-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhaofaquan 的回复:]
替LZ补充。。是每次只能载2个人的。
[/Quote]
如每次只能载2人则n>=4时时不能安全过河。
因为当第一次把牧师全都运送到对岸前的状态只可能是
本岸有2个牧师2个野人或1个牧师1个野人(两岸安全)且船在本岸
若为本岸有2个牧师2个野人则前一步必是从本岸有1个牧师1个野人到本岸有2个牧师2个野人则产生了重复;
若为本岸有1个牧师1个野人则前一步必是从本岸没有牧师到本岸有1个牧师1个野人也产生了重复,所以当n>=4时根本不能安全过河。
successful_cy 2010-09-23
  • 打赏
  • 举报
回复
大象过河的问题类似吧,有3对大象母子,任何一头小象不能离开自己的妈妈见到另外的大象,否则会被别的大象母亲杀死(小象跟小象在一起没事)。只有一条船,三头大象母亲和一头小象会划船,船只能装任意两头大象,问怎么能安全的过河。
「已注销」 2010-09-23
  • 打赏
  • 举报
回复
算法问题而已
用状态空间法表示状态如:(X,Y,Z,W,A)x表示a岸牧师数,y表示a岸野人数,zw分别表示b岸的人数,a表示船是否在a岸
运算符是船过河(两个,a->b,b->a)且带两个参数表示渡河人数
根据A的取值决定调用哪个函数,
运算一遍后检查把Y>X,W>Z,和重复的剔除
然后用宽度优先算法进行搜索就可以了。
zhaofaquan 2010-09-22
  • 打赏
  • 举报
回复
替LZ补充。。是每次只能载2个人的。
liutengfeigo 2010-09-22
  • 打赏
  • 举报
回复
一次全部装过去不是得了
tomatobin 2010-09-22
  • 打赏
  • 举报
回复
好牛,
vincent_1011 2010-09-21
  • 打赏
  • 举报
回复
这游戏玩过,。。。。。。当时我过关了,哈。。。。。。。。
csx007700 2010-09-21
  • 打赏
  • 举报
回复
学习了
Jim_King_2000 2010-09-20
  • 打赏
  • 举报
回复
深度优先,广度优先搜索。还有就是A*搜索。
S_zxing 2010-09-20
  • 打赏
  • 举报
回复
加入这艘船足够大,那么一次就过去了噢……
楼主题没说清楚……
ZoE0079 2010-09-20
  • 打赏
  • 举报
回复
貌似以前见过很多次了、、、
leonliu7558168 2010-09-20
  • 打赏
  • 举报
回复
我感觉问题还没有描述清楚!请楼主写清楚!!
wizard_tiger 2010-09-20
  • 打赏
  • 举报
回复
看船上能容几人
如船只能容2人则n等于2或3时可过,如n>=4时不可过。

设x为本岸牧师人数y为本岸野人人数
则x,y值的范围为0至n
本岸安全状态为x>=y或x=0但当x>y时对岸不安全所以安全状态为x=0或x=n或x=y
将它们画在坐标上可得到一个“|/|”型的图型图上的点即为安全点每次按点过河即可。


如船上能容4人则每次2个牧师2个野人过去,1个牧师1个野人回来重复以上步骤直至全部过河。
dixiad 2010-09-20
  • 打赏
  • 举报
回复
有>就必有<,只能等于啊..............一个牧师同一个野人划船,将相等的牧师和野人一批批送过河,最后俩人再过河,船可就得搁对岸了哟
乐CC 2010-09-20
  • 打赏
  • 举报
回复
从河岸A取人的算法可以按组合来,也可以使用牧师>=野人来筛选.
乐CC 2010-09-20
  • 打赏
  • 举报
回复
回溯法是个好办法,
1,定义三个容器(可以是数组或堆栈),分别表示河岸A,河岸B,船:
2,每次取N(船的容积)个放船上,从河岸A减掉取出的人,
3,对河岸A和船作非法判断(判断有没有吃人发生);如果有,回溯到第二步,如果没有,继续;
4,将人从船上放到河岸B;
5,对河岸B作非法判断(判断有没有吃人发生);如果有,回溯到第二步,如果没有,继续;
6,判断河岸A是否还有人,如果有,回第二步,如果没有,结束.
乐CC 2010-09-20
  • 打赏
  • 举报
回复
主要问题在于,船能乘几人,人数不同,算法也有所不同
Defonds 2010-09-20
  • 打赏
  • 举报
回复
算法。
wlbinggniblw 2010-09-20
  • 打赏
  • 举报
回复
能编写出代码?谢谢了
加载更多回复(2)

33,319

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧