黑马程序员技术交流社区

标题: 一位老农带着猫、狗、鱼过河 [打印本页]

作者: 黑马IT学员    时间: 2014-1-3 20:43
标题: 一位老农带着猫、狗、鱼过河
本帖最后由 黑马IT学员 于 2014-1-3 20:44 编辑

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


import java.util.ArrayList;
import java.util.List;
public class test10 {

//解题思路:先带走猫,后带走狗,再把猫带回,把鱼带过去,最后再把猫带过去即可

//定义两个集合,存放,带过去的动物,和剩下的动物
static List<String> there=new ArrayList<String>();
static List<String> here=new ArrayList<String>();

public static void main(String[] args) {
  here.add("cat");
  here.add("dog");
  here.add("fish");
  
  test10 test10=new test10();
  test10.take();
}


//判断动物是否安全
public boolean isSafty(List<String> list)
{
  //如果一个集合中同时出现了猫和狗,猫和鱼的都认为不安全
  if(list.add("dog")&& list.add("cat") || list.add("cat")&& list.add("fish"))
  {
   return false;
  }
  return true;
}

public void take()
{
  //得到要带走的动物
  String anim=here.get(0);
  //从剩下的集合中删除
  here.remove(here.get(0));
  
  if(anim.equals("cat"))
  {
   
    //添加到以带过去的集合里面
    there.add(anim);
   
    //继续带下一个动物
    if(here.isEmpty())
    {
     System.out.println();
     System.out.println("最后在把"+anim+"带走了");
     return;
    }
    else
    {
     System.out.println("带走了"+anim);
     System.out.print("剩下:");
     for(String s:here)
     {
      System.out.print(s+"   ");
     }
     System.out.println();
     System.out.println("----------------------------");
     take();
    }
   
   
  }else if(anim.equals("dog"))
  {
   there.add(anim);
   System.out.println("然后把"+anim+"带走");
   //判断是否安全,之后继续带下一个动物
   if(isSafty(there))
   {
    take();
   }else
   {
    String animal=there.get(0);
    there.remove(animal);
    here.add(animal);
    System.out.println("然后把"+animal+"带回");
    //继续带下一个动物
    take();
   }
  }
  else if(anim.equals("fish"))
  {
   System.out.print("之后把"+anim+"带走");
   
   take();
  }
}
}
执行结果如下图所示:



作者: 高亮亮    时间: 2014-1-3 21:54
本帖最后由 高亮亮 于 2014-1-3 21:58 编辑

这个问题有点意思.我之前做了下,跟一学霸思维不太一样,他把猫狗鱼都封装了对象,并继承动物类,做的比较符合面向对象.
我的代码面向对象痕迹不够深.发给你参考下.

  1. /*
  2. * 需求:
  3. * 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  4. * 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。
  5. * 编程解决猫狗鱼过河问题。
  6. * 分析:
  7. * 定义猫,狗,鱼元素.定义两岸集合.定义方法判断不和谐状况.
  8. * 步骤:
  9. * 1.将猫狗鱼抽象为三个String型变量.将两岸抽象为两个集合.
  10. * 2.定义判断是否和谐方法.
  11. * */

  12. public class Test10 {
  13.         public static void main(String[] args) {
  14.                 //开始过河.
  15.                 doTransport();
  16.         }

  17.         public static void doTransport() {
  18.                 // 抽象出猫,鱼,狗和两岸.
  19.                 ArrayList<String> arr1 = new ArrayList<String>();
  20.                 ArrayList<String> arr2 = new ArrayList<String>();
  21.                 arr1.add("鱼");
  22.                 arr1.add("猫");
  23.                 arr1.add("狗");
  24.                 // 农夫将要携带到船上动物.(前一字符表示农夫当前携带动物,后一字符表示上次农夫携带的动物,为了让农夫不出现重复拿同一个动物的情况)
  25.                 System.out.println("农夫,猫,鱼,狗都在此岸,开始过河.\n");
  26.                 String[] boat ={"-","-"};
  27.                 while (arr1.size() > 0) {
  28.                         move(arr1, arr2, boat);
  29.                 }
  30.                 System.out.println("\n农夫,猫,鱼,狗都到达彼岸.");
  31.         }

  32.         public static void move(ArrayList<String> arr1, ArrayList<String> arr2,String[] boat) {
  33.                 //农夫船上是否有动物,有则不需随机选择携带.
  34.                 if (boat[0].equals("-")) {
  35.                 int one=0;
  36.                 do{
  37.                                 // 农夫从此岸随机带上一个动物.
  38.                                 one = new Random().nextInt(arr1.size());
  39.                         }while(arr1.get(one).equals(boat[1]));
  40.                         boat[1]=boat[0];
  41.                         boat[0] = arr1.get(one);
  42.                         arr1.remove(one);
  43.                 }
  44.                 // 判断此岸是否和谐
  45.                 if (ifNice(arr1)) {
  46.                         // 此岸和谐,农夫则将动物送去彼岸.
  47.                         arr2.add(boat[0]);
  48.                         System.out.println("--->农夫带" + boat[0] + "去彼岸    ");
  49.                         //首先判断是否将三个动物都放彼岸,是则无需判断是否和谐.
  50.                         if(arr2.size()==3){
  51.                                 return;
  52.                         }
  53.                         // 判断彼岸是否和谐.
  54.                         if (ifNice(arr2)) {
  55.                                 // 彼岸和谐,农夫则完成此次运送.
  56.                                 boat[1]=boat[0];
  57.                                 boat[0] ="-";
  58.                                 System.out.println("    农夫单独回此岸<---");
  59.                         } else {
  60.                                 // 彼岸不和谐,农夫则将岸上动物与携带动物交换.送回此岸.
  61.                                 boat[0]=arr2.get(0);
  62.                                 System.out.println("    农夫带" +boat[0]+ "回此岸<---");
  63.                                 arr2.remove(0);
  64.                                 arr1.add(boat[0]);
  65.                                 boat[1]=boat[0];
  66.                                 boat[0]="-";
  67.                         }
  68.                 } else {
  69.                         // 如果此岸不和谐则放回此岸.
  70.                         arr1.add(boat[0]);
  71.                         boat[1]=boat[0];
  72.                         boat[0]="-";
  73.                 }
  74.         }

  75.         public static boolean ifNice(ArrayList<String> arr) {// 判断是能否共存.
  76.                 if ((arr.contains("猫") && arr.contains("狗"))
  77.                                 || (arr.contains("鱼") && arr.contains("猫"))) {
  78.                         return false;
  79.                 } else {
  80.                         return true;
  81.                 }
  82.         }
  83. }
  84.        
复制代码





作者: 高亮亮    时间: 2014-1-3 21:59
保证了农夫的随机携带动物,两次操作不为同一个动物,以及最高效率过河.
应该有两种过法.都可以出现.
作者: 王春涛    时间: 2014-5-10 15:08
强悍!学习了
作者: xiaoyuequheima    时间: 2014-6-13 21:03
这道题就是绕了点
作者: 佛说    时间: 2014-12-14 16:56
好帖子,学习了:)
作者: 考不上黑马    时间: 2015-4-28 22:56
我的基础测试也有这道题。楼上两位的代码粗略的看了一下。因为时间关系我也随便写了一个(意思是不严谨,一些健壮性的判断没做),希望能给其他同学一点灵感。我觉得我的代码很啰嗦。但是自认为我的思路比较简单。
  1. package com.itheima;

  2. import java.util.ArrayList;


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

  5. /* 思路:这个问题需要先带走猫再带走狗,下次回来的时候带上猫这样
  6. * 1.定义两个集合模拟两个地方,里面装的都是String用来模拟四种动物
  7. * 2.定义一个方法判断集合的安全情况ture为安全false为部安全
  8. * 3.这里由于时间比较紧张我就不和老师您互动了,我自己带着他们走一遍您看。如果中途出现打印false的情况就说嘛不安全。
  9. * 麻烦老师您改代码试一下了。
  10. */
  11. public class Test10 {

  12.         public static void main(String[] args) {
  13.                 // TODO Auto-generated method stub
  14.                 ArrayList<String> zheer = new ArrayList<String>();
  15.                 ArrayList<String> naer = new ArrayList<String>();
  16.                 zheer.add("farmer");
  17.                 zheer.add("dog");
  18.                 zheer.add("cat");                //初始化的时候大家都在zheer
  19.                 zheer.add("fish");
  20.                 //接下来模拟操作两地动物的变化情况。每当集合变化一次我们就判断一下此地是否安全,并打印出来。true代表安全 false代表不安全
  21.                
  22.                 //先让农夫带猫过去,zheer删除农夫和猫
  23.                 zheer.remove("farmer");
  24.                 zheer.remove("cat");
  25.                 System.out.println(safety(zheer));  //判断zheer的安全情况
  26.                 //农夫带猫到了naer,naer增加
  27.                 naer.add("farmer");
  28.                 naer.add("cat");
  29.                 System.out.println(safety(naer));        //判断naer的安全情况
  30.                 //农夫自己从naer回zheer
  31.                 naer.remove("farmer");
  32.                 zheer.add("farmer");
  33.                 System.out.println(safety(naer));
  34.                 System.out.println(safety(zheer));                //判断两地安全情况。以下都是重复步骤就不做注解了
  35.                 //农夫从zheer带走狗到naer
  36.                 zheer.remove("farmer");
  37.                 zheer.remove("dog");
  38.                 System.out.println(safety(zheer));
  39.                 naer.add("farmer");
  40.                 naer.add("dog");
  41.                 System.out.println(safety(naer));
  42.                 //农夫从naer带走猫到zheer
  43.                 naer.remove("farmer");
  44.                 naer.remove("cat");
  45.                 System.out.println(safety(naer));
  46.                 zheer.add("farmer");
  47.                 zheer.add("cat");
  48.                 System.out.println(safety(zheer));
  49.                 //农夫从zheer带走鱼到naer
  50.                 zheer.remove("farmer");
  51.                 zheer.remove("fish");        //鱼等了这么久才得到农夫的关爱,搞不好都死掉了
  52.                 System.out.println(safety(zheer));
  53.                 naer.add("farmer");
  54.                 naer.add("fish");
  55.                 System.out.println(safety(naer));
  56.                 //农夫自己过去把猫带过来
  57.                 naer.remove("farmer");
  58.                 System.out.println(safety(naer));
  59.                 zheer.add("farmer");
  60.                 System.out.println(safety(zheer));
  61.                 //农夫带着猫终于过去了
  62.                 zheer.remove("farmer");
  63.                 zheer.remove("cat");
  64.                 System.out.println(safety(zheer));
  65.                 naer.add("farmer");
  66.                 naer.add("cat");
  67.                 System.out.println(safety(naer));
  68.                
  69.                 //最后打印一下集合两遍的成员,看看是否都在
  70.                 System.out.println(zheer);
  71.                 System.out.println(naer);
  72.         }
  73.         public static boolean safety(ArrayList<String> arr){        //调用此方法判断集合是否安全,true为安全flase不安全
  74.                 if(arr.indexOf("farmer")!=-1)  //如果农夫存在这个集合,那么肯定是太平的
  75.                         return true;
  76.                 if(arr.indexOf("dog")!=-1&&arr.indexOf("cat")!=-1)        //如果农夫不在狗在猫也在就不太平
  77.                         return false;
  78.                 if(arr.indexOf("cat")!=-1&&arr.indexOf("fish")!=-1)        //如果农夫不在猫和鱼同时存在也是不安全的
  79.                         return false;
  80.                 return true;        //如果以上情况都没有发生那么此地也是安全的               
  81.         }
  82. }
复制代码

作者: li520    时间: 2015-6-2 00:04
好难啊!
作者: li520    时间: 2015-6-2 00:07
好一额汗




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