黑马程序员技术交流社区

标题: 萌妈西天取经,第一难遇到老农带猫狗鱼过河,阿弥陀佛 [打印本页]

作者: 牛牛宝    时间: 2014-12-6 23:50
标题: 萌妈西天取经,第一难遇到老农带猫狗鱼过河,阿弥陀佛
本帖最后由 牛牛宝 于 2014-12-7 00:44 编辑

本人产地河北,在没有来北京前,不知道编程是什么东东,自从遇到唐僧后才了解,很神秘,但依然继续以前的工作,在北京找工作,没学历,没经验,在北京找工作真的好难,我不想做面试达人,可还是面试了将近20家装饰 公司,最后终于找到一份工作,公司挺大的却是第三方,不停的作图,也没有结果,后来面试一个漫咖啡加盟公司,我的上司是一个韩国设计师,还带一翻译,面试还算顺利,后来打了好几个电话,我还是毅然的拒绝了,由于我的能力有限,在哪行都要从头开始学,再埋头流汗也就那么点币币,心里的埋藏的那点痒痒变的一发不可收拾,开始疯狂的学习毕姥爷的java基础视频,生动,有趣,让人轻松学习....   30天的视频,我的进度还是慢了,从早晨欧了一个上午到11点才提交自荐信,虽然白杨老师下午3点钟给我审批通过9.0分,但是焦急的心情还是我们刷新了不知多少遍,自荐信会不会不通过....迫不急待的下载我的测试题,还好,8道题都还行,全排列的问题,设计到递归,最尽力伤神的就是最后一道老农带猫狗鱼过河,让我想了两天,好羞愧,真的好想进黑马,修成正果。
看过大神的解答,我开始自己的  

难点一:老农过河要带哪个动物  

难点二:老农离开时要判断剩下的动物发全问题,猫是发生问题的源头,不能单独和其它动物在一起

首先定义两个集合,左集合为正岸,右集合为对岸

老农过河第一次带哪个动物过河,按照面向对象的思想,老农带哪个动物过河都行,只要不发生问题就行,其它不管,所以老农要自己尝试,让老农永远从左集中的0角标开始带动物,老农带农0角标的动物(left.remove(0)),发现出现问题,放回左集中add()的方法,是在集合尾部添加的,所以老农在尝试的时候就不会重复,即便是老农返回正岸再带走动物时,也不会带走刚带回来的动物,直到右集中元素为4个时,渡河成功,写的不好,望大神们多请指点!!!

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


public class Test10 {
// left集合是河的正岸,right集合为河的对岸
List<String> left = new ArrayList<String>();
List<String> right = new ArrayList<String>();

public Test10() {//初始化时,这岸就有老农,鱼,猫,狗
  left.add("farmer");
  left.add("fish");
  left.add("dog");
  left.add("cat");
}

public static void main(String[] args) {
  //创建 对象
  Test10 t=new Test10();
  //调用方法渡河
  t.run();
}

public void run() {
  
  while(left.size()>1){
   //老农要带走一个动物,遍历集合中的角标,老农从0角标开始带走
   for (int index = 0; left.size()>0; index++) {
    //老农要渡河
    left.remove("farmer");
    //老农要带走的动物
    String s=left.get(0);
    left.remove(s);
    //老农带走该动物时,看正岸是否安全
    if(isSafe(left)){
     //如果安全,对岸添加该动物和老农
     right.add(s);  
     right.add("farmer");
     System.out.println("老农带着"+s+"到对岸");
     //如果对岸元素为4时,则老农和动物成功渡河
     if(right.size()==4){
      break;     
     }
     //老农要返回,回接其它的动物
     right.remove("farmer");
     //离开对岸时,看是否能安全
     if(isSafe(right)){
      //如果安全,老农独自离开
      System.out.println("老农独自回到对岸");//老农独自回去
     }else{
      //如果离开时不安全,老农要带一个动物离开,因为老农刚带过来的添加到最后一个角标,所以要从0角标开始带走,肯定不是刚才带来的那个动物
      String s2=right.get(0);
      //S2该动物离开对岸
      right.remove(s2);
      //老农和S2回到正岸,根据集合的add()方法特点,从集合的尾部添加
      left.add(s2);
      left.add("farmer");
      System.out.println("老农带着"+s2+"返回");
     }
    }else{
     //老农带着该动物到对岸时,发现不安全,要放下,重新开始。
     left.add(s);
     left.add("farmer");
    }
   }
   
   
  }
  //right.size()==4,break跳出后,老农带着动物都渡河到对岸,成功!
  System.out.println("老农带着动物都渡河到对岸,成功!");
}
//判断是否安全的方法
public boolean isSafe(List<String> list){
  //定义一个标记
  boolean b=true;
  //如果两岸的动物大于1时,老农不在,猫和其它动物单独在一起,不安全
  if(list.size()>1&&list.contains("cat")&&!list.contains("farmer")){
   b=false;
  }
  return b;
}

}


作者: Smart_lll    时间: 2014-12-7 17:21
大河北的来点个赞!我不会这个题!!!
作者: 牛牛宝    时间: 2014-12-7 18:25
我一开始也不会,看了其它大神的,又加入自己的,整了两天才真正明白




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