黑马程序员技术交流社区

标题: 基础测试题 [打印本页]

作者: 马嘉    时间: 2014-8-20 08:48
标题: 基础测试题
本帖最后由 马嘉 于 2014-8-31 20:47 编辑

一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
求大神跟我说说具体思路,一点思路也没有,谢谢了
作者: 马嘉    时间: 2014-8-20 08:49
顶一下,求大神
作者: 舍我其谁    时间: 2014-8-20 08:58
第一次,先吧猫带过河,然后回来再带一样(狗和鱼随便一样)过河,在第二次返回的时候,吧猫再带回来,吧另外一个带回去,最后在吧猫带过去ok啦
作者: 戏言丶    时间: 2014-8-20 08:58
帮你顶一下,加油
作者: 复仇者联盟    时间: 2014-8-20 09:45
实在不会,可以百度搜一下思路,只要自己理解了,我感觉也行,这样你也可以学习到新知识。
作者: 王凯路路    时间: 2014-8-20 11:06
怎么又是这个题?
作者: 永恒星空    时间: 2014-8-20 11:17
这个也把我难住了,到现在没解决
作者: 周峰峰    时间: 2014-8-20 11:20
学习一下
作者: Imp_x    时间: 2014-8-20 13:00
舍我其谁 发表于 2014-8-20 08:58
第一次,先吧猫带过河,然后回来再带一样(狗和鱼随便一样)过河,在第二次返回的时候,吧猫再带回来,吧另 ...

                               +1
作者: 0小菜鸟0    时间: 2014-8-20 14:06
  1. class  Scheme
  2. {      
  3.         //String[] left = new String[3];
  4.         //String[] right = new String[3];
  5.    
  6.         static String[] left = {"狗","猫","鱼"};
  7.         static String[] right = {"" ,"",""};
  8.        
  9.         static int number = 0;//记录河在那边,运动物的次数

  10.         public static void main(String[] args)
  11.         {
  12.                 String str = "";
  13.                 while (leftJudge(left))//判断数组是否为空
  14.                 {
  15.                         int i = 0;
  16.                         number++;
  17.                         if (number%2 == 1)//判断船在那一般 当number为1的时候船运往右边
  18.                         {
  19.                                 for (;i<3;i++)
  20.                                 {

  21.                                         if (array(left,i)==false||left[i]==str)//判断数组是否有空,就代表没有动物并且在运回去的动物不能和运回来的动物一样
  22.                                         {
  23.                                                 continue;
  24.                                         }else{
  25.                                                 str = left[i];//把动物给船
  26.                                                 leftRi(left,right,i);//运过去河右边
  27.                                                 if (arrayJ(left)==false)//判断猫和狗。猫和鱼是否在一起,在一起的话则需要另外换一个去运;这以上三行都是试运
  28.                                                 {
  29.                                                         rightLe(left,right,i);
  30.                                                         continue;
  31.                                                 }else{
  32.                                                         break;//有合适的运到河右边则直接运过去,跳出循环
  33.                                                 }                                               
  34.                                         }
  35.                                 }
  36.                                 System.out.println("第" + number + "次, 老农用船将" +str+ "运到河右岸" );
  37.                         }else{
  38.                                         if (arrayJ(right)==true)//船运往左边的时候,如果右边不打架的话,则不需要运动物到左边,直接去河左边
  39.                                         {
  40.                                                 System.out.println("第" + number + "次, 老农用船回到了河左边");
  41.                                         }else{
  42.                                                         for (; i<3; i++)
  43.                                                         {
  44.                                                                 if (right[i]==str||array(right,i)==false)//河右边打架的,没有合适的的话判断是否带哪只会河左边,并且不能与上次带过来的动物重复,如果有一样的话,则直接跳过这只动物
  45.                                                                 {
  46.                                                                         continue;
  47.                                                                 }else{
  48.                                                                         str = right[i];//将动物放在船上运往右边
  49.                                                                         rightLe(left,right,i);
  50.                                                                         if (arrayJ(right)==false)//判断这只动物是否合适在右边,如果不行,则换下一只
  51.                                                                         {
  52.                                                                                 leftRi(left,right,i);
  53.                                                                                 continue;
  54.                                                                         }else{
  55.                                                                                 break;//如果条件全部符合,则直接运过去。
  56.                                                                 }
  57.                                                         }
  58.                                                 }
  59.                                                         System.out.println("第" + number + "次, 老农用船将" +str+ "运到河左岸" );
  60.                                 }
  61.                 }
  62.         }

  63. }


  64.         //判断左边数组是不是没有内容了;
  65.         public static boolean leftJudge(String[] left){
  66.                 if (left[0]==""&&left[1]==""&&left[2]=="")
  67.                 {
  68.                         return false;
  69.                 }else{
  70.                         return true;
  71.                 }
  72.         }

  73.         //把数组A中的字符串,移动到B中
  74.         public static void leftRi(String[] left,String[] right,int i){
  75.                 right[i] = left[i];
  76.                 Scheme.right[i] = right[i];
  77.                 Scheme.left[i] = "";
  78.         }

  79.         //把数组B中的字符串,移动到A中
  80.         public static void rightLe(String[] left,String[] right,int i){
  81.                 left[i] = right[i];
  82.                 Scheme.left[i] = left[i];
  83.                 Scheme.right[i] = "";
  84.         }

  85.         //判断数组中狗和猫,猫跟鱼是否在一起
  86.         public static boolean arrayJ(String[] array){
  87.                 if ((array[0]=="狗"&&array[1]=="猫")||(array[1]=="猫"&&array[2]=="鱼"))
  88.                 {
  89.                         return false;
  90.                 }else{
  91.                         return true;
  92.                 }
  93.         }

  94.         //判断数组中的元素那个为空,
  95.         public static boolean array(String[] array,int i){
  96.                 if (array[i]=="")
  97.                 {
  98.                         return false;
  99.                 }else{
  100.                         return true;
  101.                 }
  102.         }
  103. }
复制代码

作者: 0小菜鸟0    时间: 2014-8-20 14:08
别人是用集合做的,我做的时候还没学集合,船去左边就右边,船去右边就判断左边,把两边分开来思考

作者: 不喜欢么    时间: 2014-8-20 14:39
加油吧 我也米搞定
作者: 无所谓啦    时间: 2014-8-27 08:40
表示不懂!
作者: xplcc    时间: 2014-8-27 13:44
  1. import java.util.*;
  2. import java.lang.*;

  3. public class AcrossRiver
  4. {
  5.     public static void main(String[] args){

  6.                 new AcrossRiver().acrossRiver();
  7.         }
  8.    
  9.         //狗猫鱼过河问题
  10.         public  void acrossRiver(){
  11.             List<String> right = new ArrayList<String>();
  12.                 right.add("狗");
  13.                 right.add("猫");
  14.                 right.add("鱼");
  15.                 List<String> left = new ArrayList<String>();
  16.                 String animR = "";  //向左岸带的动物
  17.                 String animL = "";  //向右岸带的动物
  18.         int k = 0;          //记录转运的次数
  19.                 Random random = new Random();
  20.         while(right.size()>0){ //在右岸还有动物的情况下 循环运送
  21.                         k++;
  22.                 for(int i=0;i<right.size();i++){  
  23.                   
  24.                   
  25.                    if(contains(right, i, true) && !right.get(i).equals(animL)){//如果右岸不冲突 就渡河
  26.                      
  27.                           animR = right.get(i);         
  28.                           left.add(animR);               //将右岸的动物带到左岸
  29.               right.remove(i);               //同时删除右岸已经带走的动物

  30.               System.out.println("第" + k + "次将"+ animR +"带到左岸 左岸现有动物为:" + getString(left) + " 右岸动物还有:" + getString(right));
  31.             
  32.                           //在右岸还有动物的情况下判断左岸动物是否冲突,如果是则带走一个动物回右岸
  33.                           if(!contains(left, i, false) && right.size()!=0){           
  34.                              
  35.                                  int index = random.nextInt(left.size());
  36.                  animL = left.get(index);
  37.                  //判断是否是刚刚过河的那只动物 如果是 则换一只 并且判断剩下的动物不冲突
  38.                                  while(animR.equals(animL) && contains(left, index, true)){
  39.                                  
  40.                                        index = random.nextInt(left.size());
  41.                        animL = left.get(index);
  42.                                  }
  43.                                  
  44.                                  right.add(animL);   //将动物带回右岸
  45.                                  left.remove(index);  //同时删除已带走的动物
  46.                  System.out.println("第" + k + "次返回将"+ animR +"带到右岸 右岸现有动物:" + getString(right) + " 左岸动物还有:" + getString(left));
  47.                           }else animL = "";    //左岸动物不冲突 则不带回
  48.                          
  49.                  System.out.println("第" + k + "次返回没有带动物 两边动物不变");
  50.                          
  51.                            break; //一次过河结束
  52.                    }
  53.                                 
  54.                 }
  55.                
  56.                 }
  57.         }

  58.     /**
  59.           * 判断是否狗和猫 或者 猫和鱼在一起 是则返回false 否则返回true
  60.           *@param rList 需要是否有冲突判断的集合 i 集合中需要删除的索引 isRight 判断是否用到参数i
  61.           */
  62.         public static boolean contains(List<String> rList, int i, boolean isRight){
  63.                 List<String> tempList = new ArrayList<String>(rList); //为了防止改变参数的内部对象 所以在这里复制一个新的引用
  64.                 if(isRight)
  65.             tempList.remove(i);

  66.                 if(tempList.contains("狗")&&tempList.contains("猫") || tempList.contains("猫")&&tempList.contains("鱼")){
  67.                    return false;
  68.                 }else return true;
  69.        
  70.         }
  71.    
  72.         //将list转换成字符串
  73.         public static String getString(List<String> list){
  74.            StringBuffer sb = new StringBuffer();
  75.            if(list!=null){
  76.               for(int i=0;i<list.size();i++){
  77.                      sb.append(list.get(i)+" ");
  78.                   }
  79.            }
  80.            return sb.toString();
  81.         }
  82. }[img][/img]
复制代码


测试结果
第1次将猫带到左岸 左岸现有动物为:猫  右岸动物还有:狗 鱼
第1次返回没有带动物 两边动物不变
第2次将狗带到左岸 左岸现有动物为:猫 狗  右岸动物还有:鱼
第2次返回将狗带到右岸 右岸现有动物:鱼 猫  左岸动物还有:狗
第2次返回没有带动物 两边动物不变
第3次将鱼带到左岸 左岸现有动物为:狗 鱼  右岸动物还有:猫
第3次返回没有带动物 两边动物不变
第4次将猫带到左岸 左岸现有动物为:狗 鱼 猫  右岸动物还有:
第4次返回没有带动物 两边动物不变


作者: 桂何钢    时间: 2014-8-27 14:19
楼上的犀利,膜拜
作者: xplcc    时间: 2014-8-29 18:23
xplcc 发表于 2014-8-27 13:44
测试结果
第1次将猫带到左岸 左岸现有动物为:猫  右岸动物还有:狗 鱼
第1次返回没有带动物 两边动物不 ...

多谢指正。这里System打印成从右岸带走的动物了 并且else没有加大括号 这里改成


System.out.println("第" + k + "次返回将"+ animL +"带到右岸 右岸现有动物:" + getString(right) + "                                     左岸动物还有:" + getString(left));
                          }else {animL = "";    //左岸动物不冲突 则不带回
                        
                             System.out.println("第" + k + "次返回没有带动物 两边动物不变");
                        }
作者: xiaoheima    时间: 2014-8-29 18:24
新手报道 先收下了
作者: dreamseekerkun    时间: 2014-8-29 20:01
我表示我的基础测试题也抽到了,编程不知道怎么实现,没思路
作者: 曾小贤OL    时间: 2014-8-29 20:02
mmmmmmmmmmmm
作者: ︶喂〆快到碗里    时间: 2014-8-29 20:35
好考验智商。
作者: 忆梦追风    时间: 2014-8-29 22:06
先把猫带过去,回来把狗带过去,回来时把猫带回,不让猫狗同时在对岸,回来后再把鱼带过去,再回来把猫再带过去,这样猫狗鱼都带过去啦
作者: 淡调调/ka    时间: 2014-8-29 22:40
这是我刚做的基础测试题。。。。楼主请参考。:handshake

  1. package com.itheima;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Random;

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


  10. */
  11. public class Test10 {

  12.         public static void main(String[] args)
  13.         {
  14.                         Test10 itheima=new Test10();
  15.                         itheima.crossRiver();
  16.         }
  17.        
  18.         List<String> start=new ArrayList<String>();//定义起始地和目的地
  19.         List<String> end=new ArrayList<String>();
  20.        
  21.         public Test10() //程序初始化,加载农夫和动物
  22.         {
  23.                 start.add("farmer");
  24.                 start.add("cat");
  25.                 start.add("dog");
  26.                 start.add("fish");
  27.         }
  28.        
  29.         public void crossRiver()
  30.         {
  31.                 while(!start.isEmpty())//当起始地还存在动物则一直尝试带动物过河
  32.                 {
  33.                         while(start.size()>2)//当起始地还存在两个以上动物时,则一直尝试带第一个动物过河
  34.                         {
  35.                                 Random random =new Random();
  36.                                 start.remove("farmer");//农夫过河,并随机在剩下3个中带走一个
  37.                                 int index01=random.nextInt(3);//生成0~2的随机下标
  38.                                 String animal01=start.get(index01);
  39.                                 start.remove(index01);//带走该动物
  40.                                
  41.                                 if(judgeAlive(start))//判断起始地剩下的动物是否和谐
  42.                                 {
  43.                                         System.out.println("第一次带走"+animal01+"----");
  44.                                         end.add(animal01);
  45.                                         System.out.println(animal01+"成功到达目的地!农夫准备返回----");
  46.                                        
  47.                                        
  48.                                 }
  49.                                 else //不和谐则返回随机抽取起始地剩下2个动物,然后放回animl01
  50.                                 {
  51.                                         System.out.println("先带走"+animal01+",发现起始地剩下两个动物不能和谐共存,只能带回,重新再选择一只----");
  52.                                         int index02=random.nextInt(2);
  53.                                         String animal02=start.get(index02);
  54.                                         start.remove(index02);
  55.                                         start.add(animal01);
  56.                                        
  57.                                         if(judgeAlive(start))
  58.                                         {
  59.                                                 System.out.println("这次带走"+animal02+",剩下2个可以和谐共存!农夫返回继续带动物过河----");
  60.                                                 end.add(animal02);
  61.                
  62.                                         }
  63.                                         else //不和谐则返回抽取起始地2个动物中最后一个没被带走过的动物。
  64.                                         {
  65.                                                 System.out.println("第二次带走"+animal02+",发现剩下2个无法和谐共存,再次返回换一只----");
  66.                                                 int index03= 1-start.indexOf(animal01);//先获取第一次被抽取的动物的角标,则另外一个动物角标为1-start.indexOf(animal01)
  67.                                                 String animal03=start.get(index03);
  68.                                                 start.remove(index03);//带走
  69.                                                 end.add(animal03);
  70.                                                 start.add(animal02);//将第二次带走的动物放回
  71.                                                
  72.                                                 System.out.println("第三次带走"+animal03+"剩下2个可以和谐共存----");
  73.                                                 System.out.println(animal03+"成功到达目的地!农夫准备返回带下一只----");
  74.                                         }
  75.                                        
  76.                                 }
  77.                         }
  78.                         while(start.size()>1)//当起始地还剩下1只以上动物时,则不停地尝试
  79.                         {
  80.                                 Random random=new Random();
  81.                                 int index04=random.nextInt(1);//在剩下两个中随机抽取一个带过去
  82.                                 String animal04=start.get(index04);
  83.                                 start.remove(index04);
  84.                                 end.add(animal04);//带到目的地之后判断目的地2个动物是否能和谐共存
  85.                                 if(judgeAlive(end))
  86.                                 {
  87.                                         System.out.println("将"+animal04+"带过河,目的地2只可以和谐共存!,返回带第三只----!");
  88.                                 }
  89.                                 else
  90.                                 {
  91.                                         System.out.println("这一次将"+animal04+"带至目的地之后,2只动物无法和谐共存,老农只得将其带回,换一只带至目的地----");
  92.                                         end.remove(animal04);
  93.                                         String animal05=start.get(0);
  94.                                         start.remove(0);
  95.                                         start.add(animal04);//将之前带过去的放回
  96.                                         end.add(animal05);//将animol05带至目的地
  97.                                         if(judgeAlive(end))
  98.                                         {
  99.                                                 System.out.println("将"+animal05+"带过河,目的地2只可以和谐共存!,返回带第三只----!");
  100.                                         }
  101.                                         else
  102.                                         {
  103.                                                 String animal06=end.get(1-end.indexOf(animal05));
  104.                                                 System.out.println("此次带过来的"+animal05+"也无法和"+animal06+"共存··老农只能留下"+animal05+",将"
  105.                                                                 + animal06+"带回至起始地----");
  106.                                                 end.remove(animal06);
  107.                                                 System.out.println("老农回到起始地,将"+animal04+"再次带过河,并将"+animal06+"先留下----");
  108.                                                 start.remove(animal04);
  109.                                                 start.add(animal06);
  110.                                                 end.add(animal04);
  111.                                                
  112.                                                 if(judgeAlive(end))
  113.                                                 {
  114.                                                         System.out.println("目的地"+animal04+","+animal05+"可以和谐共存,老农返回带最后一只----!");
  115.                                                 }
  116.                                                 else
  117.                                                 {
  118.                                                         System.out.println("老农没辙,强逼鱼自己游过去----");
  119.                                                 }
  120.                                                
  121.                                         }
  122.                                 }
  123.                         }
  124.                         String animal07=start.get(0);
  125.                         start.remove(0);
  126.                         end.add("farmer");
  127.                         end.add(animal07);
  128.                         System.out.println("老农成功将"+animal07+"带至目的地,大家成功过河!!!----");
  129.                 }
  130.         }
  131.        
  132.        
  133.         public boolean judgeAlive(List<String>arr)//判断是否和谐
  134.         {
  135.                 if(((arr.size()==2)&&arr.contains("cat")&&arr.contains("dog"))||
  136.                   ((arr.size()==2)&&arr.contains("cat")&&arr.contains("fish")))
  137.                 {
  138.                         return false;
  139.                 }
  140.                 else
  141.                 {
  142.                         return true;
  143.                 }
  144.         }
  145.        
  146. }
复制代码

作者: 马嘉    时间: 2014-8-30 18:43
0小菜鸟0 发表于 2014-8-20 14:06

兄弟真行
作者: dhgcy    时间: 2014-8-31 13:55
谢谢分享  




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