一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。

来源:互联网 发布:linux vi 复制整行 编辑:程序博客网 时间:2024/04/27 23:08
import java.util.ArrayList;import java.util.List;import java.util.Random;/** * 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼, * 当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。 *  * 思路: * 1.猫不能和其他两种动物在一起 * 2.先把猫带到对岸 *   农夫自己回来 *   农夫把狗或鱼带到对岸 *   农夫把猫带回来 *   农夫再把剩下的动物带到对岸 *   农夫自己回来 *   农夫把猫带到对岸 * @author xiajie * */public class Test10 {//定义猫狗鱼变量     private static final String cat = " 猫 ";     private static final String dog = " 狗 ";     private static final String fish = " 鱼 ";     private static final String farmer = " 农夫 ";          private static  List<String> left = new ArrayList<String>();//左岸的集合     private static  List<String> right = new ArrayList<String>();//右岸的集合          //在无参构造方法中将猫狗鱼添加到left集合中去     public Test10(){  left.add(fish); left.add(dog); left.add(farmer); left.add(cat);          }     public static void main(String[] args) {new Test10().cross();//实例化本来对象并调用过河方法}public static void cross(){//当左岸有动物就一直继续while(left.size() > 1){left.remove(farmer);//农夫一定要带着一个动物渡河Random random = new Random();//老农随机带走一直动物int index = random.nextInt(left.size());//产生的随机数不能大于总个数,即产生了一个 不大于left.size的数字if(index == left.size()-1  && left.size()>1){//为防止老农带走刚带回来的动物,因为这个List中存储数据是先进先出的所以,不能是最后的一个数,因为最后一个数表示的是农夫刚带回来动物,最后加如leftList中的left.add(farmer);continue;//continue 跳过当前循环体continue后面的代码,继续执行下一个循环}String animal = left.get(index);//随机产生的动物left.remove(animal);//带走随机产生的一个动物    if(isFriendly(left)){//如果老农带走该动物后,正岸没有冲突,则带走该动物        right.add(farmer);//老农和动物到岸,加入Left集合中区    right.add(animal);    System.out.println("老农带着"+animal+"到了对岸");        if(right.size() == 4){ //当老农和动物全部到达对岸,则渡河完成    break;//break 跳出当前循环体    }        right.remove(farmer);//老农返回        if(isFriendly(right)){//如果老农独自返回右岸和谐,则让老农独自返回        left.add(farmer);    System.out.println("老农独自返回");        }else{//否则老农要随机带一直动物回来        String animal2 = right.get(random.nextInt(right.size()));        while(animal2.equals(animal)){                   animal2 = right.get(random.nextInt(right.size()));                   }        right.remove(animal2);    left.add(farmer);    left.add(animal2);//老农带着一个动物返回        System.out.println("老农带着"+animal2+"返回");    }                    }else{//如果老农带走该动物后,正岸发生冲突,则放回动物,重新加入Left集合中去    left.add(animal);    left.add(farmer);    }}System.out.println("所有动物都成功过河了,完成任务!!!");}//用来判断两种动物在一起是不是和谐public static boolean isFriendly(List<String> list){boolean flag ;//如果猫和其他的在一起,而没有人则不和谐if(list.size() >1 && list.contains(cat) && !list.contains(farmer)){flag = false ;}else{flag = true ;}return flag;}}


注意:一定要让程序根据题目的条件自己选择执行,不能按照自己的想法去指定程序运行的步骤。

输出结果:

老农带着 猫 到了对岸
老农独自返回
老农带着 鱼 到了对岸
老农带着 猫 返回
老农带着 狗 到了对岸
老农独自返回
老农带着 猫 到了对岸
所有动物都成功过河了,完成任务!!!

0 0