思路:用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. 算法之狼羊菜过河问题

    算法之狼羊菜过河问题 1.带羊再带狼 回来时把羊带上 然后把白菜带到对岸 最后把羊带过去 2..带羊再带菜 回来时把羊带上 然后把狼带到对岸 最后把羊带过去 关键点在于羊和两个都有联系,而狼不吃菜,

  2. 狼羊菜过河问题c语言算法,算法系列之十四:狼、羊、菜和农夫过河问题

    题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

  3. 狼羊菜过河(C实现)

            题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种 ...

  4. *python解决狼羊菜过河问题

    python解决狼羊菜过河问题 A岸有菜,羊,狼,农夫农夫必须将他们都送到B岸每次只能送一个,在保证他们不会被吃的前提下,完成任务,并得出步骤. 代码: A=[["狼",1],[& ...

  5. 基于深度优先搜索回溯法的人狼羊菜过河模型

    基于深度优先搜索回溯法的人狼羊菜过河模型 本文介绍一个农夫过河的小模型,算法 Python 实现,感觉还挺有趣的,因原为笔者课程作业论文改版而来,所以文章内容比起其他博客文章可能会比较严肃与严谨.期待 ...

  6. 算法谜题1----狼羊菜过河

    狼羊菜过河 一个人在河边,带着一匹狼.一只羊和一颗卷心菜.他需要用船将这三样东西运至对岸,然而,这艘船的空间有限,只容得下他自己和另一样东西(或狼或羊或卷心菜).若他不在场看管的话,狼就会吃羊,羊就会 ...

  7. java狼羊草过河_狼羊菜过河问题深入学习分析——Java语言描述版

    前言 这个问题的抛出,是几个星期之前的算法课程.老师分析了半天,最后的结论是:其实就是图的遍历.那时候挺懵逼的,不管是对于图,还是遍历,或者是数据结构,心里面都没有一个十足的概念,所以搁置了这么久的问 ...

  8. 狼羊菜过河问题深入学习分析——Java语言描述版

    前言 这个问题的抛出,是几个星期之前的算法课程.老师分析了半天,最后的结论是:其实就是图的遍历.那时候挺懵逼的,不管是对于图,还是遍历,或者是数据结构,心里面都没有一个十足的概念,所以搁置了这么久的问 ...

  9. 算法谜题1,狼羊菜过河

    问题描述 农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

最新文章

  1. mysql pt table sync_pt-table-sync 使用介绍
  2. 堆和栈的主要区别由以下几点:
  3. SQL学习之使用视图
  4. java 搜索引擎 关键词高亮_和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮(示例代码)...
  5. ios中生成uuid
  6. HBASE学习笔记--概述
  7. 第二季-专题4-我是bootloader设计师
  8. ProGuard正确下载网址
  9. sublime text3 eslint 安装教程
  10. eclipse中文版eclipse汉化教程
  11. 点聚AIP电子签章在Chrome、Edge新内核、360系列、FireFox、IE、Opera等浏览器中实现网页内嵌效果案例(一)
  12. 人体的神经系统图 分布,人体脑神经系统分布图
  13. iOS第三方开源库的吐槽和备忘 - 王培
  14. 图片型-半图形封面设计
  15. LeetCode/LintCode 题解丨一周爆刷字符串:神奇字符串
  16. Linux 用户管理及用户权限设置
  17. Qt编写带频谱的音乐播放器
  18. c语言双胞胎素数,征求好的算法:输出十万以内的双胞胎素数
  19. Shell Perl Python 脚本语言介绍
  20. Dell戴尔笔记本电脑Vostro 5502原装出厂系统恢复原厂系统2004

热门文章

  1. Vue.js经典项目:TodoMvc
  2. python中for循环求和_python使用隐式循环快速求和的实现示例
  3. Autohotkey 组合键与序列键的定义
  4. tomcat8中cacheMaxSize单位是多少?默认值是多少?
  5. java lang tostring_java.lang.String.toString()方法实例
  6. 台式计算机材质,台式电脑显示器购买的时候主要看哪些参数?
  7. 查看计算机配置讲解,教您如何看显示器参数!电脑显示器常见参数详解,看完秒懂!...
  8. adc网络语什么意思_adc是什么意思(专业术语大全解释)
  9. Java个人手机账户功能的基本操作实现
  10. vue.esm.js版本 引入DatePick时 会报错