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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 迷失的独白 于 2014-8-18 22:28 编辑

做完后感觉自己的基础还是不扎实,还是先复习一下吧。“老农与猫、狗、鱼” 代码如下
  1. package com.itheima;

  2. import java.util.ArrayList;

  3. /**
  4. * 第10题: 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,
  5. * 则不会发生这种问题。编程解决猫狗鱼过河问题。
  6. *
  7. * @author 王硕
  8. */
  9. /**
  10. *
  11. * 思路:
  12. * 先让一只动物过河(不确定),如果河岸上的动物是天敌则初始化,否则继续过河
  13. * 如果初始化,则再让第二只动物过河,如果河岸上的动物是天敌则初始化,否则继续过河
  14. *
  15. */

  16. public class Test10 {

  17.         public static void main(String[] args) {
  18.                 // TODO 自动生成的方法存根
  19.                 ArrayList<Animal> riverBank = new ArrayList<Animal>();
  20.                 ArrayList<Animal> oppositeBank = new ArrayList<Animal>();

  21.                 //new RiverCrossing(new AddPet().pet(riverBank), oppositeBank).function();
  22.                 //new RiverCrossing(new AddPet().pet_2(riverBank), oppositeBank).function();
  23.                 //new RiverCrossing(new AddPet().pet_3(riverBank), oppositeBank).function();
  24.                 new RiverCrossing(new AddPet().pet_4(riverBank), oppositeBank).function();
  25.                
  26.                 //打印河对岸的动物
  27.                 for(Animal pet : oppositeBank){
  28.                         System.out.println(pet.getName());
  29.                 }

  30.         }
  31. }

  32. class AddPet{

  33.         //ArrayList<Animal> riverBank = new ArrayList<Animal>();
  34.        
  35.         public ArrayList<Animal> pet(ArrayList<Animal> riverBank) {
  36.                 riverBank.add(new Animal("狗", "猫"));
  37.                 riverBank.add(new Animal("猫", "狗"));
  38.                 riverBank.add(new Animal("鱼", "猫"));
  39.                 return riverBank;
  40.         }

  41.         public ArrayList<Animal> pet_2(ArrayList<Animal> riverBank) {
  42.                 riverBank.add(new Animal("猫", "狗"));
  43.                 riverBank.add(new Animal("狗", "猫"));
  44.                 riverBank.add(new Animal("鱼", "猫"));
  45.                 return riverBank;
  46.         }

  47.         public ArrayList<Animal> pet_3(ArrayList<Animal> riverBank) {
  48.                 riverBank.add(new Animal("鱼", "猫"));
  49.                 riverBank.add(new Animal("猫", "狗"));
  50.                 riverBank.add(new Animal("狗", "猫"));
  51.                 return riverBank;
  52.         }
  53.         public ArrayList<Animal> pet_4(ArrayList<Animal> riverBank) {
  54.                 riverBank.add(new Animal("狗", "猫"));
  55.                 riverBank.add(new Animal("鱼", "猫"));
  56.                 riverBank.add(new Animal("猫", "狗"));
  57.                 return riverBank;
  58.         }
  59.        
  60. }
  61. class RiverCrossing{       
  62.         //定义河岸,指向null,临时的为了不空指针异常直接初始化为集合
  63.         private ArrayList<Animal> riverBank = null;
  64.         private ArrayList<Animal> oppositeBank = null;
  65.         private ArrayList<Animal> temp = new ArrayList<Animal>();       
  66.        
  67.         public RiverCrossing(ArrayList<Animal> riverBank,
  68.                         ArrayList<Animal> oppositeBank) {
  69.                 //初始化
  70.                 this.riverBank = riverBank;
  71.                 this.oppositeBank = oppositeBank;
  72.                 this.temp.addAll(this.riverBank);
  73. }
  74.        
  75.         public void function(){
  76.                 //调用过河方法
  77.                 riverCrossing();
  78.         }
  79.        
  80.         private void initialization() {
  81.                 // 这里是初始化,让动物全部放在河岸
  82.                 riverBank.clear();
  83.                 oppositeBank.clear();
  84.                 this.riverBank.addAll(temp);
  85.         }

  86.         private void riverCrossing() {
  87.                 // 第一只过河
  88.                 oppositeBank.add(riverBank.get(0));
  89.                 riverBank.remove(0);
  90.                 //确定初始化的次数
  91.                 int count = 0;
  92.                 while (true)
  93.                 {

  94.                         if (riverBank.size() == 2)//判断河岸是否是两只动物
  95.                         {        count++;
  96.                                 System.out.println("河岸有2只");//判断是否是天敌
  97.                                 if (riverBank.get(0).getEnemy().equals(riverBank.get(1).getName())
  98.                                                 || riverBank.get(1).getEnemy().equals(riverBank.get(0).getName()))
  99.                                 {
  100.                                         System.out.println("河岸是天敌");//如果是天敌,判断标记是否不同
  101.                                         if ((riverBank.get(0).isFlag() == riverBank.get(1).isFlag()))
  102.                                         {
  103.                                                 System.out.println("确定标记相同");//标记相同,不考虑这里,这里只是判断其中的一个
  104.                                                 if (riverBank.get(0).isFlag() == true)
  105.                                                 {
  106.                                                         // 这里其中一个标记,因为顺序的原因,这里不起作用
  107.                                                         System.out.println("不是天敌");
  108.                                                 } else
  109.                                                 {
  110.                                                         System.out.println("是天敌,初始化");//如果是天敌则初始化,再让第二只动物先过河
  111.                                                         initialization();
  112.                                                         oppositeBank.add(riverBank.get(count));
  113.                                                         riverBank.remove(count);
  114.                                                 }

  115.                                         } else
  116.                                         {
  117.                                                 System.out.println("标记不同,天敌过河一个");//当标记不同时,让此岸先存在的动物过河
  118.                                                 oppositeBank.add(riverBank.get(0));
  119.                                                 riverBank.remove(0);
  120.                                         }
  121.                                 } else
  122.                                 {
  123.                                         System.out.println("不是天敌,过河一个");//当不是天敌的时候,标记改变,并让第二只动物过河
  124.                                         riverBank.get(0).setFlag(true);
  125.                                         riverBank.get(1).setFlag(true);
  126.                                         oppositeBank.add(riverBank.get(1));
  127.                                         riverBank.remove(1);
  128.                                         System.out.println("河岸有" + riverBank.size() + "只");
  129.                                 }
  130.                         } else
  131.                         {
  132.                                 if (oppositeBank.size() == 2)
  133.                                 {
  134.                                         System.out.println("对岸有2只");//判断对岸有几只动物
  135.                                         if (oppositeBank.get(0).getEnemy()
  136.                                                         .equals(oppositeBank.get(1).getName())
  137.                                                         || oppositeBank.get(1).getEnemy().equals(oppositeBank
  138.                                                                         .get(0).getName()))
  139.                                         {
  140.                                                 System.out.println("是天敌");//判断是否是天敌,
  141.                                                 if ((oppositeBank.get(0).isFlag() != oppositeBank.get(1).isFlag()))
  142.                                                 {
  143.                                                         System.out.println("确定标记不相同,第一只过河");//判断标记是否不同,如果是则让此岸先存在的动物过河
  144.                                                         riverBank.add(oppositeBank.get(0));
  145.                                                         oppositeBank.remove(0);
  146.                                                 }
  147.                                         } else
  148.                                         {
  149.                                                 System.out.println("对岸不是天敌");//判断对岸是否天敌
  150.                                                 if ((oppositeBank.get(0).isFlag() == oppositeBank.get(1).isFlag()))
  151.                                                 {
  152.                                                         System.out.println("对岸标记相同");//如果是判断标记是否相同
  153.                                                         if (oppositeBank.get(0).isFlag() == true)
  154.                                                         {
  155.                                                                 System.out.println("河岸最后一只过河");//标记相同,且被改变过则让河岸的最后一只动物过河
  156.                                                                 oppositeBank.add(riverBank.get(0));
  157.                                                                 riverBank.remove(0);
  158.                                                                 System.out.println("河岸有" + riverBank.size()
  159.                                                                                 + "只动物");
  160.                                                                 System.out.println("对岸有" + oppositeBank.size()
  161.                                                                                 + "只动物");
  162.                                                                 System.out.println("过河结束");
  163.                                                                 break;

  164.                                                         }
  165.                                                 }
  166.                                         }
  167.                                 }
  168.                         }
  169.                 }
  170.         }
  171. }
  172. // 动物类
  173. class Animal {
  174.         // 动物名称
  175.         private String name;
  176.         // 动物的天敌
  177.         private String enemy;
  178.         // 标记,确定标记不同,然后让其中一只动物过河
  179.         private boolean flag = false;

  180.         public Animal(String name, String enemy) {
  181.                 this.name = name;
  182.                 this.enemy = enemy;
  183.         }

  184.         public String getName() {
  185.                 return name;
  186.         }

  187.         public String getEnemy() {
  188.                 return enemy;
  189.         }

  190.         public boolean isFlag() {
  191.                 return flag;
  192.         }

  193.         public void setFlag(boolean flag) {
  194.                 this.flag = flag;
  195.         }
  196. }
复制代码





exam.zip

32.37 KB, 阅读权限: 10, 下载次数: 16

19 个回复

倒序浏览
好牛的撒
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
厉害!!!
回复 使用道具 举报
有点长了!
回复 使用道具 举报

你看着是挺长的,其实把一些废话和打印语句去掉,再加上花括号缩进去掉,也就是120行
而且还都封装出去了,
回复 使用道具 举报
yqj 中级黑马 2014-8-19 19:17:49
8#
赞一个,我当时也做了这道题!
回复 使用道具 举报
基础题都这么复杂,代码好长,楼主的基础还是很不错啊,加油
回复 使用道具 举报
左脑想你 来自手机 中级黑马 2014-8-19 21:19:17
10#
愁死我可
回复 使用道具 举报
多谢分享,表示好---长{:2_33:},正在学习
回复 使用道具 举报
不错哦……
回复 使用道具 举报
其实换一种思路 做, 其实没那么复杂的 !!!
回复 使用道具 举报
hsy 中级黑马 2014-8-20 10:20:30
14#
面试的时候遇到这个题的话,直接认倒霉吧:D
回复 使用道具 举报
迷失的独白 发表于 2014-8-19 09:39
你看着是挺长的,其实把一些废话和打印语句去掉,再加上花括号缩进去掉,也就是120行
而且还都封装出去了 ...

你尝试代码优化一下。
回复 使用道具 举报
{:2_31:}{:2_31:}
回复 使用道具 举报
下载下来,学习学习
回复 使用道具 举报
张周飞 发表于 2014-8-20 09:38
其实换一种思路 做, 其实没那么复杂的 !!!

你不要奢望一个刚看完视频的人能够编出多么成熟的代码来
回复 使用道具 举报
THE_FUTURE 发表于 2014-8-20 10:49
你尝试代码优化一下。

这是你逼我的,最终优化完,102行,花括号占了26行
回复 使用道具 举报
卧槽,这得多长啊!{:3_47:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马