题目: 有三个人和三只鬼在一条河的一岸,需要过河,河中有一条小船,最多可以同时容纳两位,过河的过程中,河岸的任意一边如果,鬼的数目多于人的数目的时候,鬼就会乘机吃掉人,请用程序找出能使人和鬼都能安全过河的办法。 import java.util.ArrayList; import java.util.List; public class Test { /** * 左岸人鬼统计 left.get(0)表示人的数量 left.get(1)表示鬼的数量 **/ private List<Integer> left = new ArrayList<Integer>(); /** * 右岸人鬼统计 left.get(0)表示人的数量 left.get(1)表示鬼的数量 **/ private List<Integer> right = new ArrayList<Integer>(); /** * 初始化左右两岸人鬼数量,左岸人鬼各三个,需要安全过到右岸 */ public Test() { left.add(3); left.add(3); right.add(0); right.add(0); } /** * 查找过河方法 */ public void spySendWay() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (sendTwoPerson()) { // 如果左岸人鬼都成功过河,结束循环 if (left.get(0) == 0 && left.get(1) == 0) { break; } if (backOneGhost()) { backGhost(1); System.out.print("----->1鬼回来"); } else if (backTwoGhost()) { backGhost(2); System.out.print("----->2鬼回来"); } else if (backOne()) { backPerson(1); backGhost(1); System.out.print("-->1人1鬼回来"); } else if (backOnePerson()) { backPerson(1); System.out.print("----->1人回来"); } } else if (sendTwoGhost()) { // 如果左岸人鬼都成功过河,结束循环 if (left.get(0) == 0 && left.get(1) == 0) { break; } if (backOneGhost()) { backGhost(1); System.out.print("----->1鬼回来"); } else if (backOne()) { backPerson(1); backGhost(1); System.out.print("-->1人1鬼回来"); } else if (backOnePerson()) { backPerson(1); System.out.print("----->1人回来"); } } else if (sendOne()) { // 如果左岸人鬼都成功过河,结束循环 if (left.get(0) == 0 && left.get(1) == 0) { break; } if (backTwoGhost()) { backGhost(2); System.out.print("----->2鬼回来"); } else if (backOnePerson()) { backPerson(1); System.out.print("----->1人回来"); } } System.out.println(" 左岸剩余-->>>" + left.get(0) + "人" + " " + left.get(1) + "鬼 || " + "右岸共-->>>" + right.get(0) + "人" + " " + right.get(1) + "鬼"); } System.out.println(" 左岸-->>>" + left.get(0) + "人" + " " + left.get(1) + "鬼 || " + "右岸共-->>>" + right.get(0) + "人" + " " + right.get(1) + "鬼 " + "成功过河"); } /** * 返回人 * * @param i * 返回的人数 */ private void backPerson(int i) { right.set(0, right.get(0) - i); left.set(0, left.get(0) + i); } /** * 返回鬼 * * @param i * 返回鬼数 */ private void backGhost(int i) { right.set(1, right.get(1) - i); left.set(1, left.get(1) + i); } /** * 2人过河 * * @return 是否成功 */ private boolean sendTwoPerson() { if (left.get(0) - 2 < 0) {// 左岸人数不足2,送法失败 return false; } else if (left.get(0) - 2 != 0 && left.get(0) - 2 < left.get(1)) {// 左岸人数大于0且送走2人后小于鬼数目时送法失败 return false; } else if (right.get(0) + 2 < right.get(1)) {// 右岸送过2人后人数小于鬼数送法失败 return false; } else {// 否则送法成功,并更新两岸人鬼数目 left.set(0, left.get(0) - 2); right.set(0, right.get(0) + 2); System.out.print("2人过河"); return true; } } /** * 2鬼过河 * * @return 是否成功 */ private boolean sendTwoGhost() { if (left.get(1) - 2 < 0) {// 左岸鬼数不足2,送法失败 return false; } else if (left.get(0) != 0 && left.get(0) < left.get(1) - 2) {// 左岸人数大于0且送走2鬼后小于鬼数目时送法失败 return false; } else if (right.get(0) != 0 && right.get(0) < right.get(1) + 2) {// 右岸人数大于0且小于送来两鬼后鬼的数量送法失败 return false; } else {// 否则送法成功,并更新两岸人鬼数目 left.set(1, left.get(1) - 2); right.set(1, right.get(1) + 2); System.out.print("2鬼过河"); return true; } } /** * 一人一鬼过河 * * @return 是否成功 */ private boolean sendOne() { if (left.get(0) - 1 < 0 || left.get(1) - 1 < 0) {// 左岸鬼数不足1,送法失败 return false; } else if (left.get(0) - 1 != 0 && left.get(0) - 1 < left.get(1) - 1) {// 左岸送走1人后书目不为0且人数少于送走1鬼后的鬼数,送法失败 return false; } else if (right.get(0) + 1 < right.get(1) + 1) {// 右岸送来1人和1鬼后,人数少于鬼数送法失败 return false; } else {// 否则送法成功,并更新两岸人鬼数目 left.set(0, left.get(0) - 1); right.set(0, right.get(0) + 1); left.set(1, left.get(1) - 1); right.set(1, right.get(1) + 1); System.out.print("一人一鬼过河"); return true; } } /** * 回来1人 * * @return 是否成功 */ private boolean backOnePerson() { if (right.get(0) - 1 < 0) { return false; } else if (right.get(0) - 1 == 0 && right.get(1) == 0) { return false; } else if (right.get(0) - 1 != 0 && right.get(0) - 1 < right.get(1)) { return false; } else if (left.get(0) + 1 < left.get(1)) { return false; } else { return true; } } /** * 回来1鬼 * * @return 是否成功 */ private boolean backOneGhost() { if (right.get(1) - 1 < 0) { return false; } else if (right.get(0) == 0 && right.get(1) - 1 == 0) { return false; } else if (right.get(0) != 0 && right.get(0) < right.get(1) - 1) { return false; } else if (left.get(0) != 0 && left.get(0) < left.get(1) + 1) { return false; } else { return true; } } /** * 回来2鬼 * * @return 是否成功 */ private boolean backTwoGhost() { if (right.get(1) - 2 < 0) { return false; } else if (right.get(0) == 0 && right.get(1) - 2 == 0) { return false; } else if (right.get(0) != 0 && right.get(0) < right.get(1) - 2) { return false; } else if (left.get(0) != 0 && left.get(0) < left.get(1) + 2) { return false; } else { return true; } } /** * 回来1人1鬼 * * @return 是否成功 */ private boolean backOne() { if (right.get(1) - 1 < 0 || right.get(0) - 1 < 0) { return false; } else if (right.get(0) - 1 == 0 && right.get(1) - 1 == 0) { return false; } else if (right.get(0) - 1 < right.get(1) - 1) { return false; } else if (left.get(0) + 1 < left.get(1) + 1) { return false; } else { return true; } } public static void main(String[] args) { Test t = new Test(); t.spySendWay(); } }

JAVA 寻找-人鬼过河游戏的方法相关推荐

  1. 用Maude对人鬼过河游戏建模

    人鬼过河游戏 有三个人,三只鬼,在河流的同一 侧.河中有一只两个座位的小船,小船 需要人或者鬼的操作才能从河的一侧 运动到河的另一侧.当河的一岸鬼的 数目大于人的数目,鬼会吃同岸的人. 系统不允许这种 ...

  2. java人鬼过河,java 有关人鬼过河的一个有关问题(3)

    当前位置:我的异常网» J2SE » java 有关人鬼过河的一个有关问题 java 有关人鬼过河的一个有关问题(3) www.myexceptions.net  网友分享于:2013-11-29   ...

  3. 人鬼过河(智力游戏)

    <人鬼过河> 游戏介绍: 把人和鬼都送到对岸,任何一边鬼都不能比人多,否则鬼吃人,游戏结束,5分钟不能完成者,智商属于底下!^-^

  4. 计算思维 by徐明星老师 逻辑推理、下楼、跳马、分书、八皇后、人鬼过河

    任务1.1 谁做的好事 A:不是我 B:是C C:是D D:他(C)胡说 四个人只有一个人做了好事. 三个人说真话,一个人说假话.请判断谁做了好事. 布尔代数(离散数学):将自然语言转换为机器语言(关 ...

  5. java人鬼过河_人鬼过河 算法 c或java

    参考答案如下 债券价值的计算,人鬼所需要的折现率是( ) 中国大学MOOC: 以下选项中,过河( )跟焊条药皮没关系. [判断题]在整个中国古代文学史上,算法戏曲并不是文学主流,但清初的明代遗民却可以 ...

  6. 微信王者服务器怎么删掉,《王者荣耀》如何删除微信列表里的人 2021删除游戏好友方法...

    王者荣耀如何删除游戏好友,这个里面涉及到微信和QQ等,经常会有改动的,此次如何删除呢,里面会涉及到哪些方面呢,不少人不知道的,下面就来介绍下王者荣耀怎么删除游戏好友. 王者荣耀删除游戏好友方法分享 删 ...

  7. java两人猜数字游戏,三人背后猜数字游戏

    1.背景:         猜数字,ABC三人背后各贴一个数字,正整数,各自能看到对方的数字,其中一人为另外两人之和.依次问ABC,第一轮,问A,A猜不出,问BC,同样猜不出,第二轮,AB猜不出,C说 ...

  8. java两人猜数字游戏,java之猜数字游戏

    一.要求:程序运行时 1.提示用户输入数字 2.如果猜中则输出猜对了 3.如果没猜中则提示数字大了或者小了,并提示继续猜,直到猜中 4.用户按输入0则退出游戏 5.用while循环写 6.猜的数字随机 ...

  9. 关于java中很多人用get()和set()方法,而不用public的一点总结

    在很多程序中,都喜欢定义一个privata变量,然后为这个私有变量加上get(),set()方法.那为什么不直接定义一个public变量呢?这样做到底有什么好处和意义呢?难道真的仅仅只是为了代码规范? ...

最新文章

  1. python订单管理系统功能_订单管理系统有哪些功能?
  2. opencv 的特征提取算子SIFT/ORB/SURF
  3. python函数的使用场景_Python——异常(内置异常以及应用场景)
  4. 多线程的那点事儿(之数据互斥)
  5. idea ssm框架 mysql_IDEA 2017 整合SSM框架(使用Maven创建工程)
  6. JSONSerializer把类转换成JSON字符串
  7. Node.js Unix/Linux NVM
  8. linux刷机软件,MTK平台刷机工具——SP_Flash_Tool
  9. GCJ-02火星坐标系和WGS-84坐标系转换关系
  10. 计算机存储器与寄存器的区别,存储器与寄存器的区别
  11. Latex 排版命令总结
  12. 电子计算机按钮说明,电子计算器常用按键功能说明
  13. Alcohol Sensor(1)
  14. 电脑上怎么绘制流程图?三分钟快速绘制流程图的秘诀
  15. 父母的期许与自己的愿望
  16. mac Robot Framework installation not found
  17. KATKO KEM640U开关
  18. 全国高精度数字高程模型 精度为5m的dem
  19. 如何支持RTSP播放H.265(HEVC)流
  20. 【python】python列表去重的5种常见方法实例

热门文章

  1. mysql合并统计总数_mysql统计多表交织组合总数
  2. 2022年技术人365天写作手册-day01
  3. c++,将一个整数反转(包括负数)
  4. 怎样将cad布局导出来_cad布局出图教程(请问 CAD布局里面的图 怎么复制出来)...
  5. 【Python从零到壹】运算符的基本使用
  6. 将军与英雄服务器维护,服务器维护了⊙_⊙?
  7. 洛谷OJ素数及其筛法刷题集
  8. php ajax xmlhttpreq 上传文件 get,使用jQuery Ajax异步上传文件方法总结
  9. 【MySQL】数据库的概述
  10. Docker常用指令分析