您的位置:首页 > 编程语言 > Java开发

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: