A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马嘉 中级黑马   /  2014-8-20 08:48  /  2615 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马嘉 于 2014-8-31 20:47 编辑

一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
求大神跟我说说具体思路,一点思路也没有,谢谢了

25 个回复

倒序浏览
顶一下,求大神
回复 使用道具 举报
第一次,先吧猫带过河,然后回来再带一样(狗和鱼随便一样)过河,在第二次返回的时候,吧猫再带回来,吧另外一个带回去,最后在吧猫带过去ok啦
回复 使用道具 举报
帮你顶一下,加油
回复 使用道具 举报
实在不会,可以百度搜一下思路,只要自己理解了,我感觉也行,这样你也可以学习到新知识。
回复 使用道具 举报
怎么又是这个题?
回复 使用道具 举报
这个也把我难住了,到现在没解决
回复 使用道具 举报
学习一下
回复 使用道具 举报
Imp_x 高级黑马 2014-8-20 13:00:13
9#
舍我其谁 发表于 2014-8-20 08:58
第一次,先吧猫带过河,然后回来再带一样(狗和鱼随便一样)过河,在第二次返回的时候,吧猫再带回来,吧另 ...

                               +1
回复 使用道具 举报
  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. }
复制代码

点评

这么复杂  发表于 2014-8-29 21:00
回复 使用道具 举报
别人是用集合做的,我做的时候还没学集合,船去左边就右边,船去右边就判断左边,把两边分开来思考
回复 使用道具 举报
加油吧 我也米搞定
回复 使用道具 举报
表示不懂!
回复 使用道具 举报
xplcc 中级黑马 2014-8-27 13:44:48
14#
  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次返回没有带动物 两边动物不变

点评

第2次返回将狗带到右岸 右岸现有动物:鱼 猫 左岸动物还有:狗 第2次返回没有带动物 两边动物不变 ?!这里有问题吧!将猫带到右岸   发表于 2014-8-28 17:43
回复 使用道具 举报
楼上的犀利,膜拜
回复 使用道具 举报
xplcc 中级黑马 2014-8-29 18:23:13
16#
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 + "次返回没有带动物 两边动物不变");
                        }
回复 使用道具 举报
新手报道 先收下了
回复 使用道具 举报
我表示我的基础测试题也抽到了,编程不知道怎么实现,没思路
回复 使用道具 举报
mmmmmmmmmmmm
回复 使用道具 举报
好考验智商。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马