黑马程序员技术交流社区

标题: 一个很有意思的题目。 [打印本页]

作者: 怀念黑海岸    时间: 2014-8-26 20:54
标题: 一个很有意思的题目。
      今天在论坛上看到一个很有意思的题目:
      一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
      这个问题最大难点就在于逻辑判断,其实代码很简单。现在把自己的代码贴上来,以供饭后消遣:
package com.codeWrite;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class FamerCrossRiver {
        public void crossRiver()  throws Exception{
                 List<String> bc =new ArrayList<String>();//未过河的动物列表
                 List<String> ac =new ArrayList<String>();//已过河的动物列表
                 bc.add("猫");
                 bc.add("狗");
                 bc.add("鱼");
                String fm ="农夫";
                int time =0;//过河次数
                String ra=RelaAnimal.猫.name();  //关联动物是猫
                String cn=null;            //当前准备和农夫一起过河的动物
                while(bc.size()>0){                                 
                        time++;
                         System.out.println("现在有"+bc.size()+"只动物准备和农夫过河");
                         sop("这些动物分别是:");
                        for(String each:bc){
                                 System.out.print(each+" ");
                        }
                         System.out.println();
                        if(ac.size()==0){   //第一次过河要带猫过河
                                cn =ra;
                                bc.remove(ra);
                         }
                        else if(bc.size()>1&bc.contains(ra)&ac.size()!=0){//当没过河的动物不止一只且包括猫存在时
                                 ListIterator<String> ii =bc.listIterator();
                                 while(ii.hasNext()){
                                         String now=ii.next();
                                         if(!now.equals(ra)){
                                                cn=now;
                                         }
                                 }
                                 bc.remove(cn);
                         }else if(bc.size()==1&bc.contains(ra)){  //当没过河的动物中只剩猫的时候
                                 cn =ra;
                                bc.remove(ra);
                         }else{   //如果没过河的动物中没有猫,那么随意取一个动物跟随农夫过河
                                 cn =bc.get(0);
                                 bc.remove(0);
                        }
                       
                        System.out.println("第"+time+"次:"+fm+"过河...带上"+cn+",过河中...");
                         Thread.sleep(2000);
                         ac.add(cn);
                      if(bc.size()!=0){   //当还有动物没过河的情况下,农夫需要再次返回。
                                 time++;
                                 if(ac.size()!=1&ac.contains(ra)){ //如果河对岸有不止一只动物且包括猫的话就要带猫回去
                                        ac.remove(ra);
                                        System.out.println("第"+time+"次:"+fm+"准备返回...带上"+ra+",过河中...");
                                         Thread.sleep(2000);
                                        bc.add(ra);
                                 }else{
                                        System.out.println("第"+time+"次:"+fm+"准备返回...,过河中...");
                                         Thread.sleep(2000);
                                }
                          }
                        sop("河对岸留下了:"+ac.size()+"只动物,分别是:");
                              for(String each:ac){
                                    System.out.print(each+" ");
                               }
                                     System.out.println();
                        }
                 sop("所有动物被农夫带过河了...");
         }
                public void sop(Object obj){
                        System.out.println(obj.toString());
         }
         public static void main(String[] args) throws Exception{
                 FamerCrossRiver fcr =new FamerCrossRiver();
                fcr.crossRiver();
         }
}
enum RelaAnimal{
        猫("猫");
        private RelaAnimal(String msg){
        }
}
作者: 李煜    时间: 2014-8-26 23:19
还有这样的题吗,我对逻辑题什么的最感兴趣了
不过这个题好像太简单了:o
作者: 许愿じ☆VE杰    时间: 2014-8-27 06:29
先收藏、、
作者: sunshine9091    时间: 2014-8-27 07:15
我的基础测试最后一题就是这道题!
作者: 孤守星空    时间: 2014-8-27 07:35
李煜 发表于 2014-8-26 23:19
还有这样的题吗,我对逻辑题什么的最感兴趣了
不过这个题好像太简单了

我说一点老题目吧。类似的
1.三母亲三女儿要过河,一次可过两个,船上必须有一个留下来划船(可替换),唯一限定条件就是女儿不能在离开自己母亲的情况单独碰到其他女儿的母亲。三母女全部过河
2.3L,5L,8L三杯子,8L水平分。默认水在8L杯子中
3.蛙跳。左边三只青蛙跳到右边,右边三青蛙跳到左边。中间两空位。形如:
  ###()()&&&.
  左蛙只能右移或者跳过一个青蛙(保证有空位)。右蛙同理
4.过桥对短时间吧。有一群人,过桥时间,1s,3s,5s,6s,8s,12s.过桥为两人一起过。以慢的为准,限定条件是桥上必须有一个人。(除非全部过桥)
5.汉诺塔吧·······,随便设定一坨塔高N层,全部移至右侧最少需要几步。(假设有三个空位)
作者: Kikyou    时间: 2014-8-27 07:44
mark,好多逻辑题
作者: 低调小邦    时间: 2014-8-27 07:51
好难啊,现在的我完全看不懂
作者: 恣意的豆腐    时间: 2014-8-27 08:17
       mark
作者: 张周飞    时间: 2014-8-27 09:16
LZ 我的基础题也有这题  不过还好  比较简单的
作者: 李章敏    时间: 2014-8-27 09:18
感觉自己现在还不行                                                      
作者: wwfkofufo    时间: 2014-8-27 09:30
  是啊,感觉现在的自己要真要独立做出来,还有点难度的。
作者: 君行    时间: 2014-8-27 10:09
学习了                                 
作者: abc83983682    时间: 2014-8-27 10:33
学习学习
作者: 小洁呵呵    时间: 2014-8-27 10:38
这个题目是很有意思。。。。。。。
作者: 男人你得有范    时间: 2014-8-27 10:56
有意思,呵呵
作者: 菜鸟一号    时间: 2014-8-27 11:36
十分好,思路很清析
作者: 彭卫红    时间: 2014-8-28 00:09
这个题,刚看完。。。。
作者: TheBest__^    时间: 2014-8-28 10:43
:P不错!顶一个
作者: 王凯路路    时间: 2014-8-28 10:51
逻辑题啊.....相当愁人啊....
作者: lhtwm1    时间: 2014-8-28 12:11
收藏了  学习
作者: 不服™け你咬我    时间: 2014-8-28 21:25
学习学习




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