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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   /  2014-10-20 20:13  /  2051 人查看  /  16 人回复  /   4 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.*;
  2. class CrossRiver
  3. {
  4.         public static void main(String[] args)
  5.         {               
  6.                 LinkedList<String> here=new LinkedList<String>();
  7.                 LinkedList<String> there=new LinkedList<String>();
  8.                 here.addFirst("猫");
  9.                 here.addFirst("鱼");
  10.                 here.addFirst("狗");
  11.                 int time=1;
  12.                 while(true)
  13.                 {
  14.                         String temp=here.pollFirst();
  15.                         if(here.isEmpty())
  16.                         {
  17.                                 System.out.println("第"+time+++"次老农带"+temp+"过河。");
  18.                                 break;
  19.                         }
  20.                         if(isSafety(here))
  21.                         {
  22.                                 System.out.println("第"+time+++"次老农带"+temp+"过河。");
  23.                                 there.addFirst(temp);
  24.                         }
  25.                         else
  26.                         {
  27.                                 here.addLast(temp);
  28.                                 continue;
  29.                         }
  30.                         if(!isSafety(there))
  31.                         {
  32.                                 temp=there.pollLast();
  33.                                 System.out.println("返回时把"+temp+"带回来。");
  34.                                 here.addLast(temp);
  35.                         }

  36.                        
  37.                                
  38.                        
  39.                
  40.                 }

  41.         }
  42.         public static boolean isSafety(LinkedList lt)
  43.         {
  44.                 if(lt.contains("猫")&&lt.contains("狗"))
  45.                         return false;
  46.                 if(lt.contains("猫")&&lt.contains("鱼"))
  47.                         return false;
  48.                 return true;
  49.         }

  50. }
复制代码

这问题我觉得,老农作为调解者和操作者,和猫狗鱼一样放入集合中是不是不太合适?因为他们属性是不一样的。也就是说我们只需要替老农确定带三种动物过河的顺序即可。上面代码中基本上是这样一个模型:here 和there分别代表这边和对岸,相当于两个容器,老农离开岸边的情况有两种,一种是从这边出发,一种是从对岸返回。
先说第一种:
当老农从here到there去的时候,先取here中第一个元素(用temp存储),然后判断here中是否有安全问题,如果有,就把该元素放回到here的尾部,然后再取here的第一个元素,重复刚才的步骤直到没有安全问题,此时,将取到的元素放到there的顶部。
然后是第二种:
当农夫从there返回here的时候,先判断there中是否有安全问题,如果有,则将there中尾部(因为刚才放入的元素在顶部,为了确保不重复,所以从尾部取)的元素取出,此时则不再需要判断安全问题,因为此时there中只有一个元素,然后将该元素放回到here的尾部,如果没有安全问题,则农夫自己返回即可。
重复上面两个步骤,直到here为空即可。


回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马