注册 登录
编程论坛 JAVA论坛

请帮忙看看农夫带动物过河的代码,为什么会死循环

笔墨痕干 发布于 2015-05-06 13:39, 808 次点击
程序代码:
package com.itheima;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**

 * 第10题: 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。

 *           当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。

 *

 *

 
*/
public class Test10 {
    static int count=0;//记录船使用的次数
    public static void main(String[] args){
        //两个集合分别代表了左岸,右岸,初始时老农,猫,狗,鱼都在左岸。
        LinkedList linkLeft=new LinkedList();
        LinkedList linkRight=new LinkedList();
        linkLeft.addLast("老农");
        linkLeft.addLast("猫");
        linkLeft.addLast("狗");
        linkLeft.addLast("鱼");
      
        //一个字符串数组,代表了船,同时船上同时只能有两个元素
        String[] boat={"",""};
        //准备过河,船上有老农
        boat[0]=(String) linkLeft.remove(0);
        //左岸没有元素时停止循环
        while(!linkLeft.isEmpty()){
            //通过遍历,向左岸运送元素
            for(int i=0;i<linkLeft.size();i++){
                System.out.println("i是:"+i);
                //每运一个元素,左岸减少1
                boat[1]=(String) linkLeft.removeFirst();
                System.out.println("动物是:"+boat[1]);
                //调用函数判断左岸元素是否能共存
                boolean flage=judge(linkLeft);
                //如果左岸元素可以共存
                if(flage==true){
                    //说明船使用了一次
                    count++;
                    //向右岸增加左岸的运送的元素
                    linkRight.addFirst(boat[1]);
                    //判断右岸元素能否共存
                    boolean b=judge(linkRight);
                    System.out.println(b);
                    //如果能共存,就输出
                    if(b==true){
                        System.out.println("第"+count+"次,从左岸运到右岸,运输的是:"+boat[1]);
                        break;
                    }
                    //如果不能共存,取走之前存放在右岸的元素,把此元素在放回左岸
                    else{
                        System.out.println("第"+count+"次,从左岸运到右岸,运输的是:"+boat[1]);
                        boat[1]=(String)linkRight.removeLast();
                        count++;
                        linkLeft.addLast(boat[1]);//为什么加上这句话之后程序就变成了死循环
                        System.out.println("第"+count+"次,从右岸运到左岸,运输的是:"+boat[1]);
                       
                        continue;
                    }
               
                }
                //如果左岸元素不能共存,在左岸添加已经被删除的元素
                else{
                    linkLeft.addLast(boat[1]);
                    break;
                }
               
            }
           
           
        }
//        linkRight.add("老农");
//        System.out.println("同时老农上岸");
        System.out.println(linkRight);
        System.out.println(linkLeft);
        boat[0]="";
        boat[1]="";
    }

//判断元素是否能共存
    private static boolean judge(LinkedList list) {
        // TODO Auto-generated method stub
        if(list.contains("猫")&&list.contains("鱼"))
            return false;
        if(list.contains("猫")&&list.contains("狗"))
            return false;
        if(list.contains("猫")&&list.contains("狗")&&list.contains("鱼")){
            System.out.println("sdsfs");
            return true;
        }
        return true;
    }
}
    linkLeft.addLast(boat[1]);//为什么加上这句话之后程序就变成了死循环
加上这句话之后就死循环了,帮我看看,急求!!!
3 回复
#2
d2769212612015-05-08 16:02
回复 楼主 笔墨痕干
你的 判断共存方法 有误。每次运送完成之后,会通过第一条判断,直接return  fales了
#3
xz8422667362015-05-16 16:43
楼上加一
#4
掌舵者2015-05-17 14:24
把judge()方法改成这样就完事了:
//判断元素是否能共存
    private static boolean judge(LinkedList list) {
        // TODO Auto-generated method stub
        if(list.contains("猫")&&list.contains("狗")&&list.contains("鱼")){
            System.out.println("sdsfs");
            return true;
        }
        if(list.contains("猫")&&list.contains("鱼"))
            return false;
        if(list.contains("猫")&&list.contains("狗"))
            return false;
        
        return true;
    }
1