社区
数据结构与算法
帖子详情
一个比较有难度的题目,怎么用程序解决
abc优希
2010-12-12 10:46:30
过河问题:
有一猎人和一只狼,一个妈妈和她的两个孩子(A和B),一个爸爸和他两个孩子(C和D)要通过一小船过河。
小船一次只能载两个人(狼也算一人),
孩子和狼不能划船,
猎人不在狼伤害所有人,
妈妈们不在爸爸伤害妈妈的孩子,
同样爸爸不在妈妈伤害爸爸的孩子。
...全文
582
25
打赏
收藏
一个比较有难度的题目,怎么用程序解决
过河问题: 有一猎人和一只狼,一个妈妈和她的两个孩子(A和B),一个爸爸和他两个孩子(C和D)要通过一小船过河。 小船一次只能载两个人(狼也算一人), 孩子和狼不能划船, 猎人不在狼伤害所有人, 妈妈们不在爸爸伤害妈妈的孩子, 同样爸爸不在妈妈伤害爸爸的孩子。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
youxuesjszwddr
2011-01-17
打赏
举报
回复
值得学习啊
gonxi
2011-01-11
打赏
举报
回复
遍列一下值空间就可以了
computerlibin
2011-01-10
打赏
举报
回复
人工智能中见过,不过还是不会
abc优希
2011-01-06
打赏
举报
回复
import java.util.Iterator;
import java.util.Stack;
public class River {
private StringBuffer shore = null;
private StringBuffer thither = null;
private String boat = null;
Stack<String> course = new Stack<String>();
private String top = "";
private boolean flag = false;
private River() {
shore = new StringBuffer("MmmFffNW");
thither = new StringBuffer(8);
boat = "";
}
private boolean licit(String bevy) {
if ((bevy.indexOf('W') != -1) && (bevy.length() > 1)) {
if ((bevy.indexOf('N') == -1))
return false;
}
if ((bevy.indexOf('M') != -1) && (bevy.indexOf('f') != -1)) {
if ((bevy.indexOf('F') == -1))
return false;
}
if ((bevy.indexOf('F') != -1) && (bevy.indexOf('m') != -1)) {
if ((bevy.indexOf('M') == -1))
return false;
}
return true;
}
private boolean licitBoat() {
if (1 == boat.length()) {
if ((boat.indexOf('W') != -1) || (boat.indexOf('m') != -1)
|| (boat.indexOf('f') != -1))
return false;
}
if (2 == boat.length()) {
if ((boat.indexOf('N') == -1) && (boat.indexOf('M') == -1)
&& (boat.indexOf('F') == -1))
return false;
}
return licit(boat);
}
private void go() {
int len = boat.length();
char[] c = boat.toCharArray();
int index = -1;
for (int i = 0; i < len; i++) {
index = shore.toString().indexOf(c[i]);
shore.deleteCharAt(index);
}
thither.append(boat);
}
private void come() {
int len = boat.length();
char[] c = boat.toCharArray();
int index = -1;
for (int i = 0; i < len; i++) {
index = thither.toString().indexOf(c[i]);
thither.deleteCharAt(index);
}
shore.append(boat);
}
public boolean doGo() {
go();
if (licit(shore.toString()) && licit(thither.toString()))
return true;
return false;
}
public boolean doCome() {
come();
if (licit(shore.toString()) && licit(thither.toString()))
return true;
return false;
}
public boolean putBoat(String people) {
boat = people;
return licitBoat();
}
public void organiseGo() {
StringBuffer people = new StringBuffer(2);
char c1 = 0, c2 = 0;
boolean canBoat = false;
int start;
for (int i = 0; i < shore.length() - 1; i++)
for (int j = i + 1; j < shore.length(); j++) {
people.delete(0, 2);
c1 = shore.charAt(i);
people.append(c1);
c2 = shore.charAt(j);
people.append(c2);
if(!course.empty())top = course.peek();
if ((top.indexOf(c1) != -1) && (top.indexOf(c2) != -1))
continue;
canBoat = putBoat(people.toString());
if (canBoat) {
course.push(people.toString());
if (doGo()) {
organiseCome();
}
if (flag) {
return;
} else {
shore.insert(i, c1).insert(j, c2);
start = thither.lastIndexOf(course.peek());
thither.delete(start, start + 2);
course.pop();
}
}
}
for (int i = 0; i < shore.length(); i++) {
people.delete(0, 2);
c1 = shore.charAt(i);
people.append(c1);
top = course.peek();
if ((top.indexOf(c1) != -1) && (top.length() == 1))
continue;
canBoat = putBoat(people.toString());
if (canBoat) {
course.push(people.toString());
if (doGo()) {
organiseCome();
}
if (flag) {
return;
} else {
shore.insert(i, c1);
thither.deleteCharAt(thither.length() - 1);
course.pop();
}
}
}
}
public void organiseCome() {
if (shore.length() == 0) {
System.out.println("恭喜您成功过河!输出结果");
Iterator<String> iter = course.iterator();
int i = 1;
while (iter.hasNext()) {
i = i * (-1);
if (-1 == i)
System.out.print(iter.next() + "去-> <-");
else
System.out.println(iter.next() + "回");
}
flag = true;
return;
}
StringBuffer people = new StringBuffer(2);
char c1 = 0, c2 = 0;
boolean canBoat = false;
int start;
for (int i = 0; i < thither.length(); i++) {
people.delete(0, 2);
c1 = thither.charAt(i);
people.append(c1);
top = course.peek();
if ((top.indexOf(c1) != -1) && (top.length() == 1))
continue;
canBoat = putBoat(people.toString());
if (canBoat) {
course.push(people.toString());
if (doCome()) {
organiseGo();
}
if (flag) {
return;
} else {
course.pop();
thither.insert(i, c1);
shore.deleteCharAt(shore.length() - 1);
}
}
}
for (int i = 0; i < thither.length() - 1; i++)
for (int j = i + 1; j < thither.length(); j++) {
people.delete(0, 2);
c1 = thither.charAt(i);
people.append(c1);
c2 = thither.charAt(j);
people.append(c2);
top = course.peek();
if ((top.indexOf(c1) != -1) && (top.indexOf(c2) != -1))
continue;
canBoat = putBoat(people.toString());
if (canBoat) {
course.push(people.toString());
if (doCome()) {
organiseGo();
}
if (flag) {
return;
} else {
thither.insert(i, c1).insert(j, c2);
start = shore.lastIndexOf(course.peek());
shore.delete(start, start + 2);
course.pop();
}
}
}
}
public static void main(String[] args) {
River pr = new River();
pr.organiseGo();
}
}
------------------------------------------------------
恭喜您成功过河!输出结果
NW去-> <-N回
mN去-> <-WN回
Mm去-> <-M回
FM去-> <-F回
WN去-> <-M回
FM去-> <-F回
fF去-> <-WN回
fN去-> <-N回
WN去-> <-
yqyqyoyo
2011-01-06
打赏
举报
回复
问题解决了,把代码贴出来看看····顺便结贴给分。。
abc优希
2011-01-06
打赏
举报
回复
今天终于把问题给解答了
开心
Debugcool
2010-12-15
打赏
举报
回复
猎人、狼、爸爸、妈妈、A、B、C、D一共有8个对象,可以用一个整数的低8bit来表示(1表示有,0表示无),这样河的两岸的状态就可以用两个整数来保存,预处理出来不合法的状态,然后就可以直接广搜就行了,如果要求效率高的话,可以加上启发式什么的,但是这样的状态显然不是很多,至少少于 256 * 256 = 65535,直接广度优先搜索就能瞬秒出结果了。
wizard_tiger
2010-12-15
打赏
举报
回复
如用回溯法可以吗?
lzc52151
2010-12-13
打赏
举报
回复
化成畫,這是一個最短路徑問題
keeya0416
2010-12-13
打赏
举报
回复
[Quote=引用 3 楼 wizard_tiger 的回复:]
一猎人P
一只狼W
一个妈妈M 和她的两个孩子(A和B)
一个爸爸F 和他两个孩子(C和D)
P和W过河P回来;
P和A过河P和W回来;
M和B过河M回来;
M和F过河F回来;
P和W过河M回来;
F和M过河F回来;
F和C过河P和W回来;
P和D过河P回来;
P和W过河;
[/Quote]
原来如此 佩服
NowDoIT
2010-12-13
打赏
举报
回复
这个用程序应该怎么设计?
pmars
2010-12-13
打赏
举报
回复
[Quote=引用 3 楼 wizard_tiger 的回复:]
一猎人P
一只狼W
一个妈妈M 和她的两个孩子(A和B)
一个爸爸F 和他两个孩子(C和D)
P和W过河P回来;
P和A过河P和W回来;
M和B过河M回来;
M和F过河F回来;
P和W过河M回来;
F和M过河F回来;
F和C过河P和W回来;
P和D过河P回来;
P和W过河;
[/Quote]
如此这般,最后两步没想到!
恩,深搜吧,只是限制比较多!限制多,可减的支就多了!
llongfeng2008
2010-12-13
打赏
举报
回复
做过这种游戏,是一种智力题,头一次听说用程序做呢?学习中……
wizard_tiger
2010-12-13
打赏
举报
回复
一猎人P
一只狼W
一个妈妈M 和她的两个孩子(A和B)
一个爸爸F 和他两个孩子(C和D)
P和W过河P回来;
P和A过河P和W回来;
M和B过河M回来;
M和F过河F回来;
P和W过河M回来;
F和M过河F回来;
F和C过河P和W回来;
P和D过河P回来;
P和W过河;
pmars
2010-12-13
打赏
举报
回复
请lz给一下答案吧,他们是如何过河的?
keeya0416
2010-12-13
打赏
举报
回复
这个题目是不是有问题啊
貌似就没解的
逆向思考下
最后一步分 2 种情况
1. 猎人和狼
2. 爸爸和妈妈
如果是2的话,倒数第2步是谁划船回来的? 所以 2 不成立
如果是1的话,那倒数第2步是猎人划船回来的;这样倒数第3步就是猎人带一个小孩过去的;这样倒数第4步是谁划船回来的? 又不成立了
不知我遗漏了什么东西,望楼主解释下
日立奔腾浪潮微软松下联想
2010-12-13
打赏
举报
回复
人工智能的过河问题,A*算法。
flysnowhite
2010-12-13
打赏
举报
回复
状态图,看过程序算法教材上编过狼、人、白菜的算法。
li88yz
2010-12-13
打赏
举报
回复
高手啊,学习了
sjkof
2010-12-13
打赏
举报
回复
状态图的转换,一旦某个状态是非法的,就可以把这一分支减去
加载更多回复(2)
C语言经典
题目
900例
在这份资源集合中,我们不仅可以看到C语言的全貌,还能通过
解决
一个
个精选的编程
题目
来提升自己的编程技能。 C语言的核心概念非常丰富,从基础的变量定义到复杂的函数指针操作,每个细节都充满了深奥的逻辑和技巧。...
计算机二级python真题题库(
题目
+答案)电子版笔记2
基本操作题通常需要考生填空完成,这类
题目
在考试中起着开门红的作用,虽然
难度
较低,但是准确性要求高,考生需要确保每
一个
填空都符合
题目
要求。 简单应用题要求考生编写一段代码来
解决
特定的问题,这需要考生对...
题目
难度
评估方法研究综述
因此,
题目
难度
评估已成为教育数据挖掘领域的
一个
重要研究方向,拥有大量研究工作。全面回顾了近十年
题目
难度
评估研究领域的研究进展,将
题目
难度
分为
题目
绝对
难度
和
题目
相对
难度
两类,并对现有的
题目
难度
评估方法进行了...
微信小
程序
毕业设计选题:高通过率小
程序
题目
100例
目前移动端的设计则是目前非常流行的选择,其中基于微信小
程序
的设计借助了微信平台,
比较
方便用户随时随地的使用,可以很好的
解决
校内外各类业务场景,同时
题目
可以选择的空间较大,大家可以选来做毕业设计的
题目
。
自动生成中小学数学
题目
的控制台小
程序
前段时间写了
一个
自动生成中小学数学
题目
的控制台小
程序
下面简要介绍一下我这次的
一个
开发过程 需求: 1、命令行输入用户名和密码,如果用户名和密码都正确,提示输入小学、初中和高中三个选项中的
一个
,否则...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章