JAVA 寻找-人鬼过河游戏的方法
2009-05-08 17:15
274 查看
题目: 有三个人和三只鬼在一条河的一岸,需要过河,河中有一条小船,最多可以同时容纳两位,过河的过程中,河岸的任意一边如果,鬼的数目多于人的数目的时候,鬼就会乘机吃掉人,请用程序找出能使人和鬼都能安全过河的办法。 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代码实现游戏服务器生成全局唯一ID的方法汇总
- 图方法:寻找无向图联通子集的JAVA版本
- [推荐视频教程]-[Java][传智播客 俄罗斯方法游戏开发 视频教程][avi]
- ProGuard总结和混淆Android代码中遇到的问题的解决方法以及寻找getSomething游戏
- Java写贪吃蛇游戏,用双缓冲重写update方法解决了闪烁问题,有出现了这个问题……
- java快速寻找一个数组的最大值或最小值, min, max,三种方法
- Java贪吃蛇游戏(坐标方法)
- Java基本功练习四(用方法的思想编程举例,如显示当前时间、检验信用卡号合法性与类别、掷骰子游戏等)
- 【开源java游戏框架libgdx专题】-06-使用libgdx自带的日志方法
- 运用java中的wait和notifyAll方法模拟玩家等待游戏进入场景
- java通过反射 寻找配置文件 调用方法
- Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】
- Java日期时间处理常用方法
- Java中字符串split方法使用简介
- java的构造方法
- java 多线程的三种方法
- 关于Java中static方法的一点理解
- LeetCode-287. Find the Duplicate Number (JAVA)寻找重复元素
- Java程序发送邮件的两种方法
- java基础 构造方法 this super