java狼羊草过河_狼羊菜过河
思路:用0/1代表所处位置,农夫、狼、羊、菜过河就是0000->1111,一共是16种状态,去掉其中的不可能的状态如0011(羊和菜单独一起)是10种。
可以用图的方式表示:
或者用树的方式表示
简单代码实现如下:
package algorithm;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public class CrossRiver {
static int farmer = 0, wolf = 1, sheep = 2, cabbage = 3;
static int start = 0, end = 15;
static List listResult = new ArrayList();
static boolean cross(int[] conds) {
for (int curr : conds) {
// 跳过已发生的状态
if (listResult.contains("" + curr)) continue;
listResult.add("" + curr);
// 如已找到解,则返回
if (curr == end) return true;
// 找到可以转化的状态
int[] nexts = IntStream.range(0, 16).filter(item -> isValid(curr, item)).toArray();
// 如所有状态都无解,则移除当前步骤
if (!cross(nexts)) listResult.remove("" + curr);
// 如已找到解,则直接返回
if(listResult.contains("" + end)) return true;
}
return false;
}
// 是否满足条件
static boolean isValid(int curr, int next) {
if (position(curr, farmer) == position(next, farmer)) {
return false;
} // 农夫没过河
if (position(next, wolf) == position(next, sheep) & position(next, farmer) != position(next, wolf)) {
return false;
} // 狼羊单独
if (position(next, sheep) == position(next, cabbage) & position(next, farmer) != position(next, sheep)) {
return false;
} // 羊菜单独
if (position(curr, farmer) != position(curr, wolf) & position(curr, wolf) != position(next, wolf)) {
return false;
} // 狼不在身边不能带着过河
if (position(curr, farmer) != position(curr, sheep) & position(curr, sheep) != position(next, sheep)) {
return false;
} // 羊不在身边不能带着过河
if (position(curr, farmer) != position(curr, cabbage) & position(curr, cabbage) != position(next, cabbage)) {
return false;
} // 菜不在身边不能带着过河
if (Math.abs(curr - next) != 8 & Math.abs(curr - next) != 9 & Math.abs(curr - next) != 10
& Math.abs(curr - next) != 12) {
return false;
} // 超载或其他情况
return true;
}
// 获取位置
static char position(int i, int pos) {
String tmp = Integer.toBinaryString(i);
tmp = ("0000" + tmp).substring(tmp.length());
return tmp.charAt(pos);
}
static void print() {
String out = "";
String east = "东岸:";
String west = "西岸:";
if (position(15, farmer) == 0) {
east += "农夫 ";
} else {
west += "农夫 ";
}
if (position(15, wolf) == 0) {
east += "狼 ";
} else {
west += "狼 ";
}
if (position(15, sheep) == 0) {
east += "羊 ";
} else {
west += "羊 ";
}
if (position(15, cabbage) == 0) {
east += "菜 ";
} else {
west += "菜 ";
}
out += east + "\n" + west + "\n";
System.out.println(out);
}
public static void main(String[] args) {
//把农夫、狼、羊、菜过河看作从0000 -> 1111的变化
int[] conditions = { start };
cross(conditions);
listResult.stream().forEach(item -> {
String tmp = Integer.toBinaryString(Integer.valueOf(item));
tmp = ("0000" + tmp).substring(tmp.length());
System.out.print(tmp + " ");
});
}
}
java狼羊草过河_狼羊菜过河相关推荐
- 算法之狼羊菜过河问题
算法之狼羊菜过河问题 1.带羊再带狼 回来时把羊带上 然后把白菜带到对岸 最后把羊带过去 2..带羊再带菜 回来时把羊带上 然后把狼带到对岸 最后把羊带过去 关键点在于羊和两个都有联系,而狼不吃菜,
- 狼羊菜过河问题c语言算法,算法系列之十四:狼、羊、菜和农夫过河问题
题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...
- 狼羊菜过河(C实现)
题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种 ...
- *python解决狼羊菜过河问题
python解决狼羊菜过河问题 A岸有菜,羊,狼,农夫农夫必须将他们都送到B岸每次只能送一个,在保证他们不会被吃的前提下,完成任务,并得出步骤. 代码: A=[["狼",1],[& ...
- 基于深度优先搜索回溯法的人狼羊菜过河模型
基于深度优先搜索回溯法的人狼羊菜过河模型 本文介绍一个农夫过河的小模型,算法 Python 实现,感觉还挺有趣的,因原为笔者课程作业论文改版而来,所以文章内容比起其他博客文章可能会比较严肃与严谨.期待 ...
- 算法谜题1----狼羊菜过河
狼羊菜过河 一个人在河边,带着一匹狼.一只羊和一颗卷心菜.他需要用船将这三样东西运至对岸,然而,这艘船的空间有限,只容得下他自己和另一样东西(或狼或羊或卷心菜).若他不在场看管的话,狼就会吃羊,羊就会 ...
- java狼羊草过河_狼羊菜过河问题深入学习分析——Java语言描述版
前言 这个问题的抛出,是几个星期之前的算法课程.老师分析了半天,最后的结论是:其实就是图的遍历.那时候挺懵逼的,不管是对于图,还是遍历,或者是数据结构,心里面都没有一个十足的概念,所以搁置了这么久的问 ...
- 狼羊菜过河问题深入学习分析——Java语言描述版
前言 这个问题的抛出,是几个星期之前的算法课程.老师分析了半天,最后的结论是:其实就是图的遍历.那时候挺懵逼的,不管是对于图,还是遍历,或者是数据结构,心里面都没有一个十足的概念,所以搁置了这么久的问 ...
- 算法谜题1,狼羊菜过河
问题描述 农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...
最新文章
- mysql pt table sync_pt-table-sync 使用介绍
- 堆和栈的主要区别由以下几点:
- SQL学习之使用视图
- java 搜索引擎 关键词高亮_和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮(示例代码)...
- ios中生成uuid
- HBASE学习笔记--概述
- 第二季-专题4-我是bootloader设计师
- ProGuard正确下载网址
- sublime text3 eslint 安装教程
- eclipse中文版eclipse汉化教程
- 点聚AIP电子签章在Chrome、Edge新内核、360系列、FireFox、IE、Opera等浏览器中实现网页内嵌效果案例(一)
- 人体的神经系统图 分布,人体脑神经系统分布图
- iOS第三方开源库的吐槽和备忘 - 王培
- 图片型-半图形封面设计
- LeetCode/LintCode 题解丨一周爆刷字符串:神奇字符串
- Linux 用户管理及用户权限设置
- Qt编写带频谱的音乐播放器
- c语言双胞胎素数,征求好的算法:输出十万以内的双胞胎素数
- Shell Perl Python 脚本语言介绍
- Dell戴尔笔记本电脑Vostro 5502原装出厂系统恢复原厂系统2004
热门文章
- Vue.js经典项目:TodoMvc
- python中for循环求和_python使用隐式循环快速求和的实现示例
- Autohotkey 组合键与序列键的定义
- tomcat8中cacheMaxSize单位是多少?默认值是多少?
- java lang tostring_java.lang.String.toString()方法实例
- 台式计算机材质,台式电脑显示器购买的时候主要看哪些参数?
- 查看计算机配置讲解,教您如何看显示器参数!电脑显示器常见参数详解,看完秒懂!...
- adc网络语什么意思_adc是什么意思(专业术语大全解释)
- Java个人手机账户功能的基本操作实现
- vue.esm.js版本 引入DatePick时 会报错