黑马程序员技术交流社区

标题: 求助啊!猫猫狗狗的问题死循环啊,卡哪儿了啊? [打印本页]

作者: bigbean    时间: 2014-3-6 00:04
标题: 求助啊!猫猫狗狗的问题死循环啊,卡哪儿了啊?
本帖最后由 bigbean 于 2014-3-6 00:06 编辑
  1. package com.itheima;
  2. /*
  3.   一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  4. 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,
  5. 则不会发生这种问题。编程解决猫狗鱼过河问题。
  6. 需求分析:狗会咬猫,猫会吃鱼
  7. 步骤:
  8. 1.先将猫拿过去
  9. 2.将鱼(狗)拿过去,不过要带着猫回来
  10. 3.放下猫,再带着狗(鱼)过去
  11. 4.最后带着猫过去
  12. */
  13. class PassRiver
  14. {               
  15.          String thisway =new String();
  16.          String thatway =new String();
  17.          String boxi=new String();
  18.          String boxa=new String();int x ,y,time;
  19.          boolean locate =true;
  20.          String all[]={"猫","狗","鱼","老农"};
  21.          
  22. PassRiver()
  23. {
  24. thisway="猫狗鱼老农";
  25. thatway="";
  26. }
  27.          
  28. void re(){
  29.         thisway= boxi;
  30.         thatway=boxa;
  31. }

  32.                          String go(String str)
  33.                          {
  34.                                  if(locate=true)
  35.                                  {
  36.                                  thisway=thisway.replace(str, "");
  37.                                  thatway=thatway.concat(str);
  38.                                  thisway=thisway.replace("老农", "");
  39.                                  thatway=thatway.concat("老农");
  40.                                  }
  41.                                  else if(safe()){ System.out.println("农夫带着"+str+"去对面了,这边还剩下"+thisway);}
  42.                                         else re();
  43.                                 y++;locate=false;
  44.                                  return str;
  45.                         
  46.                          }
  47.                         
  48.                           String back(String str)
  49.                          {        
  50.                                  if(locate=false)
  51.                                  {
  52.                                  thatway=thatway.replace(str, "");
  53.                                  thisway=thisway.concat(str);
  54.                         
  55.                                  thatway=thatway.replace("老农", "");
  56.                                  thisway=thisway.concat("老农");
  57.                                  }
  58.                                  else if(safe()){
  59.                                          System.out.println("农夫带着"+str+"回来了");}//这边有:"+thisway+",那边还剩下:"+thatway
  60.                                 else {System.out.println("农夫空手回来了,这边有:"+thisway+",那边还剩下:"+thatway) ;re();};y++;
  61.                                 locate=false; return str;
  62.                          }
  63.   boolean safe()//判断动物是否安全
  64.   {                boolean sa;
  65.                   sa=judge(thisway)&&judge(thatway);
  66.                   if(sa);
  67.                   else re();
  68.                   return sa;
  69.   }
  70.         
  71.          String printState()//输出状态方法
  72.          {
  73.                  String ps="现在本岸有:"+thisway+"\n对岸有:"+thatway;//
  74.                  return ps;
  75.          }
  76.         
  77.          
  78. void play()//开始过河
  79. //{        while((thatway.contains("猫")&&thatway.contains("鱼")&&thatway.contains("狗")&&thatway.contains("老农"))==false)
  80.         {//System.out.println("1"+printState());
  81.                 System.out.println("农夫,猫,鱼,狗都在这边,开始过河.\n");
  82.                 while(thisway.contains(all[1])
  83.                                 || thisway.contains(all[2])
  84.                                 ||thisway.contains(all[0])||thisway.contains(all[3]))
  85.                 {//        System.out.println("2"+printState());
  86.                         //System.out.println("88");
  87.                  while(locate&&thisway.contains(all[x])&safe())
  88.                          {x=y%4;
  89.                          System.out.println(time+printState());
  90.                          go(all[x]);
  91.                
  92.                          System.out.println("333"+printState()); y++;
  93.                         }
  94.                 while((locate==false)&&thatway.contains(all[x])&safe())
  95.                  {        x=y%4;
  96.                         // System.out.println("4"+printState());
  97.                          back(all[x]);
  98.                         System.out.println("444"+printState()); y++;
  99.                  }
  100.                
  101.                 }

  102.                 //if(locate)locate=false;else locate=true;
  103.          }
  104. //}
  105.                 Boolean judge(String str)
  106.                 {        
  107.                         if(str.contains("老农"))
  108.                         {
  109.                                 return true;
  110.                         }
  111.                                 else if(str.contains("猫")&str.contains("鱼"))
  112.                                 {
  113.                                         return false;
  114.                                 }
  115.                                         else if(str.contains("猫")&str.contains("狗"))
  116.                                         {
  117.                                                 return false;
  118.                                         }
  119.                         return true;
  120.                 }
  121. }

  122. public class Test10 {

  123.         public static void main(String[] args) {
  124.                 // TODO Auto-generated method stub
  125.                  PassRiver aa=new  PassRiver();
  126.                  aa.play();
  127.                  
  128.                  System.out.println(aa.printState());
  129.         }

  130. }
复制代码
求助啊,面试题最后一题做不出来啊!!!做了半天做了个死循环出来啊!!!

作者: 榨菜    时间: 2014-3-6 01:43
我看了你一看到你的代码就头大,,我试着自己写了下,给你个思路:  首先有个动物接口,动物类有个判断天敌的方法。 把河抽为一个对象, 有两个list集合,分别存放过河 和没有过河的狗猫人鱼,  河有个方法,判断过河的动物是否存在天敌,如果有人在就没有天敌。   
  1. cat过桥
  2. fish不能过河,从头开始

  3. cat过桥
  4. dog不能过河,从头开始

  5. fish过桥
  6. dog过桥
  7. cat过桥
  8. 全部过河
复制代码

作者: bigbean    时间: 2014-3-6 12:08
榨菜 发表于 2014-3-6 01:43
我看了你一看到你的代码就头大,,我试着自己写了下,给你个思路:  首先有个动物接口,动物类有个判断天敌 ...

{:3_53:}{:3_53:}多谢了!
作者: bigbean    时间: 2014-3-6 14:37
zengming13 发表于 2014-3-6 14:07
这个问题应该是这样的思路:
1.要过河,肯定不能一次过,因此会有过去和回来两个方法。
2.猫狗鱼他们之间有 ...

:handshake 谢了~
作者: 一年_Hei    时间: 2014-3-6 18:44
楼主遇到的基础题和我一样,我刚刚写完。因为手机就不交流了
作者: 老貓钓鱼    时间: 2014-3-6 20:53
基础题第10题,今天刚写完,提交申请了
作者: bigbean    时间: 2014-3-6 23:18
老貓钓鱼 发表于 2014-3-6 20:53
基础题第10题,今天刚写完,提交申请了

:( 咋做的?
作者: 老貓钓鱼    时间: 2014-3-7 09:11
bigbean 发表于 2014-3-6 23:18
咋做的?
  1. package com.itheima;

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

  4. /**
  5. * 题目10: 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
  6. *
  7. * 步骤:
  8. *                 1、先带猫过去,然后回来把狗带过,把猫带回来
  9. *                 2、再把鱼带过去,再回来带猫
  10. *
  11. * 分析:
  12. *                 1、定义2个集合,分别代表河二岸的动物
  13. *                 2、定义一个判断动物和谐的方法
  14. *                 3、先从集合中拿出一只动物准备过河,此时判断集合中余下的动物的和谐关系,如果和谐,则将此动物带过河,如果不和谐则重新换一只动物,直到取到和谐的动物为止
  15. *                 4、将动物放入对岸的集合中,然后判断集合当中有没有不和谐的关系,如果有的话就带回,否则空手带回
  16. */

  17. public class Test10 {
  18.        
  19.         static int i = 0;
  20.         public static void main(String[] args) {
  21.                 //定义两个集合,分别代表河的这边(here)和对岸(there)
  22.                 ArrayList<String> here = new ArrayList<String>();  
  23.                 ArrayList<String> there = new ArrayList<String>();
  24.                 here.add("狗");
  25.                 here.add("猫");
  26.                 here.add("鱼");
  27.                
  28.                 toTake(here, there);
  29.         }

  30.        
  31. //判断集合中动物之间的和谐关系
  32.         public static boolean isSafty(List<String> list) {
  33.                 if((list.contains("狗")&&list.contains("猫")) || (list.contains("猫")&&list.contains("鱼")))
  34.                         return false;
  35.                 return true;
  36.         }

  37.         public static void toThere(String s, List<String> here, List<String> there) {
  38.                 //判断对岸(there)集合中的动物:如果here集合中还有剩余的动物,则说明农夫还需要回去取,则说明还存在需要判断动物之间的和谐
  39.                 //将动物放入对岸(there)的集合中,然后判断集合当中有没有不和谐的关系,如果有的话就带回一只动物(需要判断和谐关系),否则空手带回
  40.                 if(!here.isEmpty()) {
  41.                         String take2Here = null;
  42.                         String temp = null;
  43.                         there.add(s);
  44.                        
  45.                         while(!isSafty(there)) {
  46.                                 if(temp != null) {
  47.                                         there.add(temp);
  48.                                 }
  49.                                 take2Here =there.remove(0);
  50.                                 temp = take2Here;
  51.                         }
  52.                        
  53.                         if(take2Here != null) {
  54.                                 System.out.println("            同时把" + take2Here + "带回来" );
  55.                                 here.add(take2Here);
  56.                         }else {
  57.                                 System.out.println("            农夫空手回来");
  58.                         }
  59.                                
  60.                 }else {
  61.                         System.out.println("            动物已全部带过河了");
  62.                 }
  63.                
  64.         }
  65.        
  66.         public static void toTake(List<String> here, List<String> there) {
  67.                 //先从here集合中拿出一只动物准备过河,此时判断集合中余下的动物的和谐关系,如果和谐,则将此动物带过河,如果不和谐则重新换一只动物,直到取到和谐的动物为止
  68.                 while(!here.isEmpty()) {
  69.                         String take2There = here.remove(0);
  70.                         if(isSafty(here)) {
  71.                                 System.out.println("第" + (++i) + "步:把" + take2There + "带到对岸");
  72.                                 toThere(take2There, here, there);//取到和谐的动物过河
  73.                         }else {
  74.                                 here.add(take2There);
  75.                         }
  76.                 }

  77.         }
  78. }
复制代码

这是我写的,仅做参考
作者: bigbean    时间: 2014-3-7 09:20
老貓钓鱼 发表于 2014-3-7 09:11
这是我写的,仅做参考

http://blog.csdn.net/guangzhaolove/article/details/17636319
你和他做的一样
作者: 老貓钓鱼    时间: 2014-3-7 09:23
bigbean 发表于 2014-3-7 09:20
http://blog.csdn.net/guangzhaolove/article/details/17636319
你和他做的一样

对啊,借鉴了思想,然后没看代码,自己写的




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