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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 怀念黑海岸 中级黑马   /  2014-8-26 20:54  /  2479 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

      今天在论坛上看到一个很有意思的题目:
      一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
      这个问题最大难点就在于逻辑判断,其实代码很简单。现在把自己的代码贴上来,以供饭后消遣:
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){
        }
}

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很久的一个题目了

查看全部评分

21 个回复

倒序浏览
还有这样的题吗,我对逻辑题什么的最感兴趣了
不过这个题好像太简单了:o
回复 使用道具 举报
先收藏、、
回复 使用道具 举报
我的基础测试最后一题就是这道题!
回复 使用道具 举报
李煜 发表于 2014-8-26 23:19
还有这样的题吗,我对逻辑题什么的最感兴趣了
不过这个题好像太简单了

我说一点老题目吧。类似的
1.三母亲三女儿要过河,一次可过两个,船上必须有一个留下来划船(可替换),唯一限定条件就是女儿不能在离开自己母亲的情况单独碰到其他女儿的母亲。三母女全部过河
2.3L,5L,8L三杯子,8L水平分。默认水在8L杯子中
3.蛙跳。左边三只青蛙跳到右边,右边三青蛙跳到左边。中间两空位。形如:
  ###()()&&&.
  左蛙只能右移或者跳过一个青蛙(保证有空位)。右蛙同理
4.过桥对短时间吧。有一群人,过桥时间,1s,3s,5s,6s,8s,12s.过桥为两人一起过。以慢的为准,限定条件是桥上必须有一个人。(除非全部过桥)
5.汉诺塔吧·······,随便设定一坨塔高N层,全部移至右侧最少需要几步。(假设有三个空位)
回复 使用道具 举报
mark,好多逻辑题
回复 使用道具 举报
好难啊,现在的我完全看不懂
回复 使用道具 举报
       mark
回复 使用道具 举报
LZ 我的基础题也有这题  不过还好  比较简单的
回复 使用道具 举报
感觉自己现在还不行                                                      
回复 使用道具 举报
  是啊,感觉现在的自己要真要独立做出来,还有点难度的。
回复 使用道具 举报
学习了                                 
回复 使用道具 举报
学习学习
回复 使用道具 举报
这个题目是很有意思。。。。。。。
回复 使用道具 举报
男人你得有范 来自手机 中级黑马 2014-8-27 10:56:34
15#
有意思,呵呵
回复 使用道具 举报
十分好,思路很清析
回复 使用道具 举报
这个题,刚看完。。。。
回复 使用道具 举报
:P不错!顶一个
回复 使用道具 举报
逻辑题啊.....相当愁人啊....
回复 使用道具 举报
收藏了  学习
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马