求解人鬼过河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);
}
}

解决方案 »

  1.   

    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() { 
    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); 


      

  2.   

    刚回了的........
    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();
    }
    }
      

  3.   

    该游戏有且只有一种能过河的方法,肯定会过河成功,我要的是正确的过河步骤另外这个贴不算,由于网速问题发重了,请点这里http://topic.csdn.net/u/20081120/08/ed6b4d59-13ad-4e2c-b641-a976e5d35ce7.html100分的贴