JAVA 寻找-人鬼过河游戏的方法
题目: 有三个人和三只鬼在一条河的一岸,需要过河,河中有一条小船,最多可以同时容纳两位,过河的过程中,河岸的任意一边如果,鬼的数目多于人的数目的时候,鬼就会乘机吃掉人,请用程序找出能使人和鬼都能安全过河的办法。 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 寻找-人鬼过河游戏的方法相关推荐
- 用Maude对人鬼过河游戏建模
人鬼过河游戏 有三个人,三只鬼,在河流的同一 侧.河中有一只两个座位的小船,小船 需要人或者鬼的操作才能从河的一侧 运动到河的另一侧.当河的一岸鬼的 数目大于人的数目,鬼会吃同岸的人. 系统不允许这种 ...
- java人鬼过河,java 有关人鬼过河的一个有关问题(3)
当前位置:我的异常网» J2SE » java 有关人鬼过河的一个有关问题 java 有关人鬼过河的一个有关问题(3) www.myexceptions.net 网友分享于:2013-11-29 ...
- 人鬼过河(智力游戏)
<人鬼过河> 游戏介绍: 把人和鬼都送到对岸,任何一边鬼都不能比人多,否则鬼吃人,游戏结束,5分钟不能完成者,智商属于底下!^-^
- 计算思维 by徐明星老师 逻辑推理、下楼、跳马、分书、八皇后、人鬼过河
任务1.1 谁做的好事 A:不是我 B:是C C:是D D:他(C)胡说 四个人只有一个人做了好事. 三个人说真话,一个人说假话.请判断谁做了好事. 布尔代数(离散数学):将自然语言转换为机器语言(关 ...
- java人鬼过河_人鬼过河 算法 c或java
参考答案如下 债券价值的计算,人鬼所需要的折现率是( ) 中国大学MOOC: 以下选项中,过河( )跟焊条药皮没关系. [判断题]在整个中国古代文学史上,算法戏曲并不是文学主流,但清初的明代遗民却可以 ...
- 微信王者服务器怎么删掉,《王者荣耀》如何删除微信列表里的人 2021删除游戏好友方法...
王者荣耀如何删除游戏好友,这个里面涉及到微信和QQ等,经常会有改动的,此次如何删除呢,里面会涉及到哪些方面呢,不少人不知道的,下面就来介绍下王者荣耀怎么删除游戏好友. 王者荣耀删除游戏好友方法分享 删 ...
- java两人猜数字游戏,三人背后猜数字游戏
1.背景: 猜数字,ABC三人背后各贴一个数字,正整数,各自能看到对方的数字,其中一人为另外两人之和.依次问ABC,第一轮,问A,A猜不出,问BC,同样猜不出,第二轮,AB猜不出,C说 ...
- java两人猜数字游戏,java之猜数字游戏
一.要求:程序运行时 1.提示用户输入数字 2.如果猜中则输出猜对了 3.如果没猜中则提示数字大了或者小了,并提示继续猜,直到猜中 4.用户按输入0则退出游戏 5.用while循环写 6.猜的数字随机 ...
- 关于java中很多人用get()和set()方法,而不用public的一点总结
在很多程序中,都喜欢定义一个privata变量,然后为这个私有变量加上get(),set()方法.那为什么不直接定义一个public变量呢?这样做到底有什么好处和意义呢?难道真的仅仅只是为了代码规范? ...
最新文章
- python订单管理系统功能_订单管理系统有哪些功能?
- opencv 的特征提取算子SIFT/ORB/SURF
- python函数的使用场景_Python——异常(内置异常以及应用场景)
- 多线程的那点事儿(之数据互斥)
- idea ssm框架 mysql_IDEA 2017 整合SSM框架(使用Maven创建工程)
- JSONSerializer把类转换成JSON字符串
- Node.js Unix/Linux NVM
- linux刷机软件,MTK平台刷机工具——SP_Flash_Tool
- GCJ-02火星坐标系和WGS-84坐标系转换关系
- 计算机存储器与寄存器的区别,存储器与寄存器的区别
- Latex 排版命令总结
- 电子计算机按钮说明,电子计算器常用按键功能说明
- Alcohol Sensor(1)
- 电脑上怎么绘制流程图?三分钟快速绘制流程图的秘诀
- 父母的期许与自己的愿望
- mac Robot Framework installation not found
- KATKO KEM640U开关
- 全国高精度数字高程模型 精度为5m的dem
- 如何支持RTSP播放H.265(HEVC)流
- 【python】python列表去重的5种常见方法实例
热门文章
- mysql合并统计总数_mysql统计多表交织组合总数
- 2022年技术人365天写作手册-day01
- c++,将一个整数反转(包括负数)
- 怎样将cad布局导出来_cad布局出图教程(请问 CAD布局里面的图 怎么复制出来)...
- 【Python从零到壹】运算符的基本使用
- 将军与英雄服务器维护,服务器维护了⊙_⊙?
- 洛谷OJ素数及其筛法刷题集
- php ajax xmlhttpreq 上传文件 get,使用jQuery Ajax异步上传文件方法总结
- 【MySQL】数据库的概述
- Docker常用指令分析