黑马程序员技术交流社区

标题: 猫狗鱼过河问题 [打印本页]

作者: 刘晟伟    时间: 2015-9-25 09:56
标题: 猫狗鱼过河问题
本帖最后由 刘晟伟 于 2015-9-26 13:29 编辑

     一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
     我想到了解决方案,先带走猫过河到对岸,然后空船回来带狗(或鱼),到达对岸回来时带着猫,把毛猫放下,再带着鱼(或狗),最后回来带猫。
      代码我就不会写了,希望高手指点。给出代码和注释
作者: mars314    时间: 2015-9-25 10:19
在论坛里看一下其它同学写的吧。
作者: DD_vincent    时间: 2015-9-25 10:58
当时我花了一个下午做这个题....
给你一些思路吧:
1.用两个集合来定义两岸的动物
2.要有一个方法,来判断老农离岸后剩下来的动物是否不会打起来
3.定义几个方法,将动物从A岸带到B岸,和从B岸带到A岸
4.最重要的一点:你是希望把动物从A岸带到B岸去,所以从B岸回A岸时应该先判断什么都不带安全不安全

作者: 刘晟伟    时间: 2015-9-25 12:42
DD_vincent 发表于 2015-9-25 10:58
当时我花了一个下午做这个题....
给你一些思路吧:
1.用两个集合来定义两岸的动物

怎么判断啊?我想不到方法
作者: DD_vincent    时间: 2015-9-25 15:48
刘晟伟 发表于 2015-9-25 12:42
怎么判断啊?我想不到方法

当猫、狗或者猫、鱼在一起的时候就不安全,返回false就行了啊
作者: 天涯莫名    时间: 2015-9-25 21:22
路过,顶一下
作者: zhaopengfei    时间: 2015-9-25 21:46
名捕吉林可疼了咯你不透诺路
作者: 915816106    时间: 2015-9-25 22:30
public class Test10 {
    int farmer,cat,dog,fish; //刚开始都为0,也就是都在河的这岸
    String type = ""; //记录农夫上一步带的是什么,防止出现死循环,当农夫自己走时type不改变
    String isnull = "";//当农夫自己走时,isnull会记录下来,防止出现死循环。
    boolean boo = false;
    public static void main(String[] args) {
            Test10 test = new Test10();
            int x = 1;//记录移动的数次
            while(true){
               test.move();
       System.out.println("第"+x+"步");
       System.out.println("河这岸有:"+test.print(0));
       System.out.println("河对岸有:"+test.print(1));
       x++;
       //当把全部东西都移动到对岸时,即可停止移动。
       if(test.farmer==1&&test.cat==1&&test.dog==1&&test.fish==1){
           break;
       }
       }
               
        
    }
   
    //农夫过河时需要判断能带什么不能带什么
    public void move(){
            
            if(farmer==0){
                    if(cat==0){
                            if(!type.equals("cat")){
                                    farmer = 1;
                                    cat = 1;
                                    if(isSafe()){
                                            type = "cat";
                                            return;
                                    }else{
                                            farmer = 0;
                                            cat = 0;
                                    }
                            }
                    }
                    if(dog==0){
                            if(!type.equals("dog")){
                                    farmer = 1;
                                    dog = 1;
                                    if(isSafe()){
                                            type = "dog";
                                            return;
                                    }else{
                                            farmer = 0;
                                            dog = 0;
                                    }
                            }
                    }
                    if(fish==0){
                            if(!type.equals("fish")){
                                    farmer = 1;
                                    fish = 1;
                                    if(isSafe()){
                                            type = "fish";
                                            return;
                                    }else{
                                            farmer = 0;
                                            fish = 0;
                                    }
                            }
                    }
                            farmer = 1;
                    
            }else if(farmer==1){
                    //当人在河对岸时需要优先考虑自已到这岸来,从而把东西带到对岸。
                    if(isnull != "farmer"){
                            farmer = 0;
                            isnull = "farmer";
                            if(isSafe()){
                                    return;
                            }else{
                                    farmer = 1;
                            }
                    }
                           
                    if(cat==1){
                            if(!type.equals("cat")){
                                    farmer = 0;
                                    cat = 0;
                                    if(isSafe()){
                                            type = "cat";
                                            isnull = "";
                                            return;
                                    }else{
                                            farmer = 1;
                                            cat = 1;
                                    }
                            }
                    }
                    if(dog==1){
                            if(!type.equals("dog")){
                                    farmer = 0;
                                    dog = 0;
                                    if(isSafe()){
                                            type = "dog";
                                            isnull = "";
                                            return;
                                    }else{
                                            farmer = 1;
                                            dog = 1;
                                    }
                            }
                    }
                    if(fish==1){
                            if(!type.equals("fish")){
                                    farmer = 0;
                                    dog = 0;
                                    if(isSafe()){
                                            type = "fish";
                                            isnull = "";
                                            return;
                                    }else{
                                            farmer = 1;
                                            fish = 1;
                                    }
                            }
                    }
            }
    }
   
    //判断现在的状态是否有冲突
    public boolean isSafe(){
            if(farmer==1){
                    if(cat==0&&fish==0)return false;
                    if(cat==0&&dog==0)return false;
            }else if(farmer==0){
                    if(cat==1&&fish==1)return false;
                    if(cat==1&&dog==1)return false;
            }
            return true;
    }
   
    //打印现在河的两岸都有什么
    public String print(int i){
            if(i==0){
                    String str = "";
                    if(farmer==0)str += "农夫    ";
                    if(dog==0)str += "狗    ";
                    if(cat==0)str += "猫    ";
                    if(fish==0)str += "鱼    ";
                    return str;
            }else if(i==1){
                    String str = "";
                    if(farmer==1)str += "农夫    ";
                    if(dog==1)str += "狗    ";
                    if(cat==1)str += "猫    ";
                    if(fish==1)str += "鱼    ";
                    return str;
            }
            return null;
    }

}
作者: Orangeapp    时间: 2015-9-25 22:55
这个问题我也是想了好久,大概的步奏想出来了,就是不知道怎么去用代码去实现。看了上面的大神写的步奏,顿时豁然开朗
作者: 芝麻糊    时间: 2015-9-25 23:05
我觉得我写的不错
  1. package com.itheima;

  2. import java.util.ArrayList;

  3. public class Test10 {
  4.        
  5.         String person = "person";
  6.         String dog = "dog";
  7.         String cat = "cat";
  8.         String fish = "fish";
  9.        
  10.         String animal,animal2;  // 后面用于得到集合中元素的临时变量
  11.        
  12. //        bank opbank 分别表示河岸和对岸
  13.         ArrayList<String> bank = new ArrayList<String>();
  14.         ArrayList<String> opbank = new ArrayList<String>();
  15.        

  16. //        初始化河岸,让人、猫、狗、鱼位于河岸, 顺序可以改变
  17.         public Test10() {
  18.                
  19.                 bank.add(person);
  20.                 bank.add(dog);
  21.                 bank.add(fish);
  22.                 bank.add(cat);
  23.                
  24.         }
  25.        
  26. //        判断和谐条件
  27.         public boolean isSafety(ArrayList<String> list) {
  28.                
  29. //                人在和谐
  30.                 if(list.contains(person)) {
  31.                         return true;
  32.                 }
  33.                
  34. //                人不在, 猫狗或猫鱼同在不和谐
  35.                 else if(list.contains(dog) && list.contains(cat) ||
  36.                                 list.contains(cat) && list.contains(fish)) {
  37.                         return false;
  38.                 }
  39. //                其他条件和谐,如何集合为空,说明岸上没有动物,自然也和谐
  40.                 return true;       
  41.         }
  42.        
  43. //        人带一只动物带到对岸
  44.         public boolean toOpbank(String animal) {
  45.                                
  46.                 bank.remove(person);
  47.                 bank.remove(animal);
  48. //                人走后岸边和谐,则去对岸
  49.                 if(isSafety(bank)) {
  50.                         opbank.add(person);
  51.                         opbank.add(animal);
  52.                         System.out.println("老农把" + animal + "带到对岸");
  53.                         return true;
  54.                        
  55. //                岸边不和谐,则回来
  56.                 } else {
  57.                         bank.add(animal);
  58.                         bank.add(person);
  59.                         return false ;
  60.                 }
  61.         }
  62.        
  63. //        如果人走后对岸和谐,人则自己回到岸边继续送其他动物
  64.         public boolean toBank() {
  65.                
  66.                 opbank.remove(person);
  67.                 if(isSafety(opbank)) {
  68.                         bank.add(person);
  69.                         System.out.println("老农一个人回到岸边");
  70.                         return true;
  71.                 } else {
  72.                         opbank.add(person);
  73.                         return false;
  74.                 }
  75.                
  76.         }
  77.        
  78. //        如果人走后对岸不和谐,人将带一只动物回岸边
  79.         public boolean toBank(String animal) {
  80.                
  81.                 opbank.remove(person);
  82.                 opbank.remove(animal);
  83.                 if(isSafety(opbank)) {
  84.                         bank.add(person);
  85.                         bank.add(animal);
  86.                         System.out.println("老农带着" + animal + "回到岸边");
  87.                         return true;
  88.                        
  89.                 } else {
  90.                         opbank.add(animal);
  91.                         opbank.add(person);
  92.                         return false;
  93.                 }
  94.         }
  95.        
  96.        
  97. //        开始渡河
  98.         public void crossRiver() {
  99.                
  100. //                岸边集合为空,则渡河成功
  101.                 if(bank.isEmpty()) {
  102.                         System.out.println("渡河成功");
  103.                         return ;
  104.                 }
  105.                
  106. //                每次都带岸边集合中第一只不是人的动物去对岸
  107.                
  108.                 animal = bank.get(0);
  109.                 if(person.equals(animal)) {
  110.                         animal = bank.get(1);
  111.                 }
  112.                 if(toOpbank(animal)){
  113.                        
  114. //                        人如果可以自己回来就自己回来,不能则带对岸集合第一只不是人的动物回来
  115.                        
  116.                         animal2 = opbank.get(0);
  117.                         if(person.equals(animal2)) {
  118.                                 animal = opbank.get(1);
  119.                         }
  120.                        
  121.                         if(!toBank()) {
  122.                                 toBank(animal2);
  123.                         }
  124.                 }
  125.                        
  126. //                递归渡河,直到岸边集合为空
  127.                 crossRiver();       
  128. }
  129.        
  130.         public static void main(String[] args) {
  131.                
  132.                 new Test10().crossRiver();
  133.         }

  134. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2