社区
数据结构与算法
帖子详情
一个比较有难度的题目,怎么用程序解决
虾米虾壳
2010-12-12 10:46:30
过河问题:
有一猎人和一只狼,一个妈妈和她的两个孩子(A和B),一个爸爸和他两个孩子(C和D)要通过一小船过河。
小船一次只能载两个人(狼也算一人),
孩子和狼不能划船,
猎人不在狼伤害所有人,
妈妈们不在爸爸伤害妈妈的孩子,
同样爸爸不在妈妈伤害爸爸的孩子。
...全文
658
25
打赏
收藏
一个比较有难度的题目,怎么用程序解决
过河问题: 有一猎人和一只狼,一个妈妈和她的两个孩子(A和B),一个爸爸和他两个孩子(C和D)要通过一小船过河。 小船一次只能载两个人(狼也算一人), 孩子和狼不能划船, 猎人不在狼伤害所有人, 妈妈们不在爸爸伤害妈妈的孩子, 同样爸爸不在妈妈伤害爸爸的孩子。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
youxuesjszwddr
2011-01-17
打赏
举报
回复
值得学习啊
gonxi
2011-01-11
打赏
举报
回复
遍列一下值空间就可以了
computerlibin
2011-01-10
打赏
举报
回复
人工智能中见过,不过还是不会
虾米虾壳
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
打赏
举报
回复
问题解决了,把代码贴出来看看····顺便结贴给分。。
虾米虾壳
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)
天梯赛L1
难度
总结 +
题目
难易分类
天梯赛L1
难度
总结
一个
月的时间,从 2 月 6 号的《L1-001 Hello World (5 分)》到 3 月 8 号的《L1-080 乘法口诀数列 (20 分)》,
一个
月的时间,断断续续的写了 80 道天梯赛 L1
难度
的
题目
… 总结下来,L1
难度
的
题目
并不难,好多
题目
都是大一的时候做过的,除了 Hello World 的输出,剩下的就是模拟题了,可能存在部分
题目
使用C++的 STL 的函数会简便很多,但绝大多数的
题目
都只是简单的或者复杂的模拟题,总结下来,L1 的
难度
不难,但是
比较
麻烦,容易卡点
题目
难度
评估方法研究综述
摘要
题目
难度
是保证试卷合理性及考试公平性的关键信息,也是智能教学系统(ITS)中的关键参数,有效支撑着包括智能组卷、
题目
自动生成和个性化习题推荐在内的多项智能教学功能。因此,
题目
难度
评估已成为教育数据挖掘领域的
一个
重要研究方向,拥有大量研究工作。全面回顾了近十年
题目
难度
评估研究领域的研究进展,将
题目
难度
分为
题目
绝对
难度
和
题目
相对
难度
两类,并对现有的
题目
难度
评估方法进行了整理和分类,其中重点分析了基于深度学习的
题目
绝对
难度
预测方法和基于深度学习的
题目
相对
难度
预测方法,并对后者包含的重要方法进行了实验分析。同时
CTF
题目
难度
等级划分
CTF
题目
难度
等级(1-10):
难度
等级 描述 用途 例子 最大分值 1 赛题的考点是非常常见的,选手们对于此类赛题可以直接进行解题步骤,并且在较短的时间内得到正确答案。该
难度
下通常不需要利用额外的工具,依靠通常电脑上有的
程序
便能够解题。 1. 通常用于ctf线上比赛的签到题;2. 对安全方向感兴趣但是没有去学习、或者刚刚接触安全方向的人员,此类主要是为了培养做题人的兴趣。 web: get/post请求、修改head头信息、cookie修改reverse:
程序
中直接明文包含flag,记事
UVA
题目
难度
分级列表
UVA
题目
难度
分级列表
题库类产品如何计算
题目
的
难度
值
一、引言 题库类产品(如猿题库、易题库等)的
一个
标配功能是预测用户未来要进行的某项考试得分,我们称之为目标考试预测分。以猿题库高考为例,即将参加高考的学生通过在题库上做大量练习,练习的效果会以学生的高考预测分呈现出来,这是学生最关注的指标,也是整个题库产品中最关键的数据。为了让“预测分”数据更加准确,我们引入了能力评估模型,通过测算用户在所有知识点上的能力水平,并将其量化成为
一个
数值。...
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章