求解人鬼过河flash小游戏的正确算法或者把我写的源码改好package game;import java.util.*;public class RiverGame {
//人
private final String PERSON = "1";
//鬼
private final String GHOST = "2";
//开始的岸上的人和鬼集合
private List<String> a;
//船上的人和鬼集合
private List<String> b;
//到达的岸上的人和鬼集合
private List<String> c; public RiverGame() {
init();
}
private void init(){
a = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
a.add(PERSON);
a.add(GHOST);
}
b = new ArrayList<String>();
c = new ArrayList<String>();
} //获取某一个岸或船上人或鬼的数量
public int getCount(List<String> arg0, String arg1) {
int count = 0;
for (String s : arg0) {
if (arg1.equals(s)) {
count++;
}
}
return count;
}
//打印List的方法
private String show(List<String> s){
StringBuffer ss=new StringBuffer();
for(String s1:s){
ss.append(s1);
}
return ss.toString();
}
//从岸到船
public void transToShip(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {
// 传两人
if ((getCount(arg0, PERSON) - 2 >= getCount(arg0, GHOST))&& (getCount(arg0, PERSON) >= 2) && (arg1.size() == 0)) {
for (int i = 0; i < 2; i++) {
arg0.remove(PERSON);
arg1.add(PERSON);
}
System.out.print("传两人 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
for (int i = 0; i < 2; i++) {
arg0.add(PERSON);
arg1.remove(PERSON);
}
}
}
// 传两鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 2) && (arg1.size() == 0)) {
for (int i = 0; i < 2; i++) {
arg0.remove(GHOST);
arg1.add(GHOST);
}
System.out.print("传两鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
for (int i = 0; i < 2; i++) {
arg0.add(GHOST);
arg1.remove(GHOST);
}
}
}
// 传一人一鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 1) && (arg1.size() == 0)) {
arg0.remove(GHOST);
arg0.remove(PERSON);
arg1.add(GHOST);
arg1.add(PERSON);
System.out.print("传一人一鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(GHOST);
arg0.add(PERSON);
arg1.remove(GHOST);
arg1.remove(PERSON);
}
}
// 传一人
if ((getCount(arg0, PERSON) - 1 >= getCount(arg0, GHOST))&& (getCount(arg0, PERSON) >= 1) && (arg1.size() <= 1)) {
arg0.remove(PERSON);
arg1.add(PERSON);
System.out.print("传一人 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(PERSON);
arg1.remove(PERSON);
}
}
// 传一鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 1) && (arg1.size() <= 1)) {
arg0.remove(GHOST);
arg1.add(GHOST);
System.out.print("传一鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(GHOST);
arg1.remove(GHOST);
}
}
} //从船到岸
public void transToBank(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {
// 传两人
if (arg1.size() <= 4 && (getCount(arg0, PERSON) == 2)&& (arg0.size() == 2)) {
for (int i = 0; i < 2; i++) {
arg0.remove(PERSON);
arg1.add(PERSON);
}
System.out.print("传两人 ");
crossRiver(arg1, reacher, direction);
}
// 传两鬼
if ((arg1.size() <= 4)&& (((getCount(arg1, PERSON) - 2 >= getCount(arg1, GHOST)) && (getCount(arg1, PERSON) > 0)) || (getCount(arg1, PERSON) == 0))&& (getCount(arg0, GHOST) == 2) && (arg0.size() == 2)) {
for (int i = 0; i < 2; i++) {
arg0.remove(GHOST);
arg1.add(GHOST);
}
System.out.print("传两鬼 ");
crossRiver(arg1, reacher, direction);
}
// 传一人一鬼
System.out.println("船:"+show(arg0));
System.out.println("岸:"+show(arg1));
System.out.println("reacher:"+show(reacher));
System.out.println(direction);
if ((arg1.size() <= 4) && (getCount(arg0, GHOST) == 1)&& (getCount(arg0, PERSON) == 1) && (arg0.size() == 2)) {
arg0.remove(GHOST);
arg0.remove(PERSON);
arg1.add(GHOST);
arg1.add(PERSON);
System.out.print("传一人一鬼 ");
crossRiver(arg1, reacher, direction);
}
// 传一人
if ((arg1.size() <= 5) && (getCount(arg0, PERSON) >= 1)&& (arg0.size() >= 1)) {
arg0.remove(PERSON);
arg1.add(PERSON);
System.out.print("传一人 ");
crossRiver(arg1, reacher, direction);
}
// 传一鬼
if ((arg1.size() <= 5)&& (((getCount(arg1, PERSON) - 2 >= getCount(arg1, GHOST)) && (getCount(arg1, PERSON) > 0)) || (getCount(arg1, PERSON) == 0))&& (getCount(arg0, GHOST) >= 1) && (arg0.size() >= 1)) {
arg0.remove(GHOST);
arg1.add(GHOST);
System.out.print("传一鬼 ");
crossRiver(arg1, reacher, direction);
}
} public void crossRiver(List<String> arg0, List<String> arg1, int direction) {
if (direction == 1) {
transToShip(arg0, arg1, a, 2);
} else if (direction == 2) {
transToBank(arg0, arg1, b, 3);
} else if (direction == 3) {
transToShip(arg0, arg1, c, 4);
} else if (direction == 4) {
if (c.size() == 6) {
System.out.println("过河了");
return;
}
transToBank(arg0, arg1, b, 1);
}
} public static void main(String[] args) {
RiverGame gr = new RiverGame();
gr.crossRiver(gr.a, gr.b, 3);
}
}
//人
private final String PERSON = "1";
//鬼
private final String GHOST = "2";
//开始的岸上的人和鬼集合
private List<String> a;
//船上的人和鬼集合
private List<String> b;
//到达的岸上的人和鬼集合
private List<String> c; public RiverGame() {
init();
}
private void init(){
a = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
a.add(PERSON);
a.add(GHOST);
}
b = new ArrayList<String>();
c = new ArrayList<String>();
} //获取某一个岸或船上人或鬼的数量
public int getCount(List<String> arg0, String arg1) {
int count = 0;
for (String s : arg0) {
if (arg1.equals(s)) {
count++;
}
}
return count;
}
//打印List的方法
private String show(List<String> s){
StringBuffer ss=new StringBuffer();
for(String s1:s){
ss.append(s1);
}
return ss.toString();
}
//从岸到船
public void transToShip(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {
// 传两人
if ((getCount(arg0, PERSON) - 2 >= getCount(arg0, GHOST))&& (getCount(arg0, PERSON) >= 2) && (arg1.size() == 0)) {
for (int i = 0; i < 2; i++) {
arg0.remove(PERSON);
arg1.add(PERSON);
}
System.out.print("传两人 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
for (int i = 0; i < 2; i++) {
arg0.add(PERSON);
arg1.remove(PERSON);
}
}
}
// 传两鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 2) && (arg1.size() == 0)) {
for (int i = 0; i < 2; i++) {
arg0.remove(GHOST);
arg1.add(GHOST);
}
System.out.print("传两鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
for (int i = 0; i < 2; i++) {
arg0.add(GHOST);
arg1.remove(GHOST);
}
}
}
// 传一人一鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 1) && (arg1.size() == 0)) {
arg0.remove(GHOST);
arg0.remove(PERSON);
arg1.add(GHOST);
arg1.add(PERSON);
System.out.print("传一人一鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(GHOST);
arg0.add(PERSON);
arg1.remove(GHOST);
arg1.remove(PERSON);
}
}
// 传一人
if ((getCount(arg0, PERSON) - 1 >= getCount(arg0, GHOST))&& (getCount(arg0, PERSON) >= 1) && (arg1.size() <= 1)) {
arg0.remove(PERSON);
arg1.add(PERSON);
System.out.print("传一人 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(PERSON);
arg1.remove(PERSON);
}
}
// 传一鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 1) && (arg1.size() <= 1)) {
arg0.remove(GHOST);
arg1.add(GHOST);
System.out.print("传一鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(GHOST);
arg1.remove(GHOST);
}
}
} //从船到岸
public void transToBank(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {
// 传两人
if (arg1.size() <= 4 && (getCount(arg0, PERSON) == 2)&& (arg0.size() == 2)) {
for (int i = 0; i < 2; i++) {
arg0.remove(PERSON);
arg1.add(PERSON);
}
System.out.print("传两人 ");
crossRiver(arg1, reacher, direction);
}
// 传两鬼
if ((arg1.size() <= 4)&& (((getCount(arg1, PERSON) - 2 >= getCount(arg1, GHOST)) && (getCount(arg1, PERSON) > 0)) || (getCount(arg1, PERSON) == 0))&& (getCount(arg0, GHOST) == 2) && (arg0.size() == 2)) {
for (int i = 0; i < 2; i++) {
arg0.remove(GHOST);
arg1.add(GHOST);
}
System.out.print("传两鬼 ");
crossRiver(arg1, reacher, direction);
}
// 传一人一鬼
System.out.println("船:"+show(arg0));
System.out.println("岸:"+show(arg1));
System.out.println("reacher:"+show(reacher));
System.out.println(direction);
if ((arg1.size() <= 4) && (getCount(arg0, GHOST) == 1)&& (getCount(arg0, PERSON) == 1) && (arg0.size() == 2)) {
arg0.remove(GHOST);
arg0.remove(PERSON);
arg1.add(GHOST);
arg1.add(PERSON);
System.out.print("传一人一鬼 ");
crossRiver(arg1, reacher, direction);
}
// 传一人
if ((arg1.size() <= 5) && (getCount(arg0, PERSON) >= 1)&& (arg0.size() >= 1)) {
arg0.remove(PERSON);
arg1.add(PERSON);
System.out.print("传一人 ");
crossRiver(arg1, reacher, direction);
}
// 传一鬼
if ((arg1.size() <= 5)&& (((getCount(arg1, PERSON) - 2 >= getCount(arg1, GHOST)) && (getCount(arg1, PERSON) > 0)) || (getCount(arg1, PERSON) == 0))&& (getCount(arg0, GHOST) >= 1) && (arg0.size() >= 1)) {
arg0.remove(GHOST);
arg1.add(GHOST);
System.out.print("传一鬼 ");
crossRiver(arg1, reacher, direction);
}
} public void crossRiver(List<String> arg0, List<String> arg1, int direction) {
if (direction == 1) {
transToShip(arg0, arg1, a, 2);
} else if (direction == 2) {
transToBank(arg0, arg1, b, 3);
} else if (direction == 3) {
transToShip(arg0, arg1, c, 4);
} else if (direction == 4) {
if (c.size() == 6) {
System.out.println("过河了");
return;
}
transToBank(arg0, arg1, b, 1);
}
} public static void main(String[] args) {
RiverGame gr = new RiverGame();
gr.crossRiver(gr.a, gr.b, 3);
}
}
//人
private final String PERSON = "1";
//鬼
private final String GHOST = "2";
//开始的岸上的人和鬼集合
private List <String> a;
//船上的人和鬼集合
private List <String> b;
//到达的岸上的人和鬼集合
private List <String> c; public RiverGame() {
a = new ArrayList <String>();
for (int i = 0; i < 3; i++) {
a.add(PERSON);
a.add(GHOST);
}
b = new ArrayList <String>();
c = new ArrayList <String>();
} //获取某一个岸或船上人或鬼的数量
public int getCount(List <String> arg0, String arg1) {
int count = 0;
for (String s : arg0) {
if (arg1.equals(s)) {
count++;
}
}
return count;
}
//打印List的方法
private String show(List <String> s){
} //从岸到船
public void transToShip(List <String> arg0, List <String> arg1,List <String> reacher, int direction) { // 传两人
...
// 传两鬼
...
// 传一人一鬼
...
// 传一人
...
// 传一鬼
...
} //从船到岸
public void transToBank(List <String> arg0, List <String> arg1,List <String> reacher, int direction) {
// 传两人
...
// 传两鬼
...
// 传一人一鬼
...
// 传一人
...
// 传一鬼
...
} public void crossRiver(List <String> arg0, List <String> arg1, int direction) {
if (direction == 1) {
transToShip(arg0, arg1, a, 2);
} else if (direction == 2) {
transToBank(arg0, arg1, b, 3);
} else if (direction == 3) {
transToShip(arg0, arg1, c, 4);
} else if (direction == 4) {
if (c.size() == 6) {
System.out.println("过河了");
return;
}
transToBank(arg0, arg1, b, 1);
}
} public static void main(String[] args) {
RiverGame gr = new RiverGame();
gr.crossRiver(gr.a, gr.b, 3);
}
}
import java.util.*;public class RiverGame {
private boolean sf = true;
private final int pairs;
private final String PERSON = "1"; // 人
private final String GHOST = "2"; // 鬼
private List<String> leftCount; // 开始的岸上的人和鬼集合
private List<String> middleCount; // 船上的人和鬼集合
private List<String> rightCount; // 到达的岸上的人和鬼集合 public RiverGame (){
this(0);
}
public RiverGame (int count) {
if(count<3){
pairs = 3;
}else{
pairs = count;
}
leftCount = new ArrayList<String>();
for (int i = 0; i < pairs; i++) {
leftCount.add(PERSON);
leftCount.add(GHOST);
}
middleCount = new ArrayList<String>();
rightCount = new ArrayList<String>();
} public int getCount(List<String> list, String name) {
int count = 0;
for (String s : list) {
if (name.equals(s)) {
count++;
}
}
return count;
} public void leftToMiddle(String str1,String str2,int step){
int personCount = 0;
int ghostCount = 0;
if(str1.equals(PERSON)){
personCount++;
}else{
ghostCount++;
}
leftCount.remove(str1);
middleCount.add(str1);
if(str2 != null&&str2.equals(PERSON)){
personCount++;
leftCount.remove(str2);
middleCount.add(str2);
}else if(str2 != null&&str2.equals(GHOST)){
ghostCount++;
leftCount.remove(str2);
middleCount.add(str2);
}
System.out.println("第"+step+"步:");
System.out.print((personCount>0?personCount+"人":"")+(ghostCount>0?ghostCount+"鬼":"")+"上船 ");
printc("过河 ");
}
public void middleToRight(String str1,String str2){
int personCount = 0;
int ghostCount = 0;
if(str1.equals(PERSON)){
personCount++;
}else{
ghostCount++;
}
middleCount.remove(str1);
rightCount.add(str1);
if(str2 != null&&str2.equals(PERSON)){
personCount++;
middleCount.remove(str2);
rightCount.add(str2);
}else if(str2 != null&&str2.equals(GHOST)){
ghostCount++;
middleCount.remove(str2);
rightCount.add(str2);
}
System.out.print((personCount>0?personCount+"人":"")+(ghostCount>0?ghostCount+"鬼":"")+"上岸; ");
}
public void rightToMiddle(String str){
if(str != null){
rightCount.remove(str);
middleCount.add(str);
System.out.print(1+(str.equals(PERSON)?"人":"鬼")+"上船 ");
}
printc("回来 ");
}
public void middleToLeft(String str){
if(str != null){
middleCount.remove(str);
leftCount.add(str);
System.out.print(1+(str.equals(PERSON)?"人":"鬼")+"上岸 ");
}
System.out.println();
}
private void printc(String s){
int personCount = getCount(middleCount, PERSON);
int ghostCount = getCount(middleCount, GHOST);
System.out.print((personCount>0?personCount+"人":"")+(ghostCount>0?ghostCount+"鬼":"")+" "+s);
if(leftCount.contains(PERSON)&&getCount(leftCount, GHOST)>getCount(leftCount, PERSON)){
sf = false;
}else if(rightCount.contains(PERSON)&&getCount(rightCount, GHOST)>getCount(rightCount, PERSON)){
sf = false;
}
}
public void crossRiver() {
int step = 0;
while(leftCount.size() != 0){
step++;
if(leftCount.size()==pairs*2){
leftToMiddle(GHOST, GHOST,step);
middleToRight(GHOST,null);
rightToMiddle(null);
middleToLeft(null);
}else if(getCount(leftCount, PERSON)-2==getCount(leftCount, GHOST)&&middleCount.size()!=0){
leftToMiddle(GHOST, null,step);
middleToRight(GHOST,null);
rightToMiddle(null);
middleToLeft(GHOST);
}else if(getCount(leftCount, PERSON)-2==getCount(leftCount, GHOST)&&middleCount.size()==0){
leftToMiddle(PERSON, PERSON,step);
middleToRight(PERSON,null);
rightToMiddle(GHOST);
middleToLeft(GHOST);
}
else if(getCount(leftCount, PERSON)>getCount(leftCount, GHOST)){
leftToMiddle(PERSON, null,step);
middleToRight(PERSON,null);
rightToMiddle(null);
middleToLeft(null);
}else if(leftCount.contains(PERSON)){
leftToMiddle(PERSON, null, step);
middleToRight(PERSON,PERSON);
rightToMiddle(GHOST);
middleToLeft(null);
}else{
leftToMiddle(GHOST, null, step);
if(leftCount.size()==0){
middleToRight(GHOST,GHOST);
}else{
middleToRight(GHOST,null);
}
rightToMiddle(null);
middleToLeft(null);
}
if(!sf){
System.out.println("过河失败!!!");
return;
}
}
System.out.println("成功过河了!");
} public static void main(String[] args) {
RiverGame gr = new RiverGame ();
gr.crossRiver();
}
}