黑马程序员技术交流社区

标题: 关于基础测试题:阿狗、阿猫、阿鱼 [打印本页]

作者: 孙小亚    时间: 2014-8-23 19:41
标题: 关于基础测试题:阿狗、阿猫、阿鱼
最近看到好几个帖子都是关于农民带狗猫鱼过河的基础测试题,后来自己也尝试练了一下,纯手写的哦!给大家看看,顺便附上截图,给给建议。。。题目:

一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。


代码: 农民带狗、猫、鱼过河(代码 结果截图).zip (46.33 KB, 下载次数: 440)
代码有点长了,大家下载看吧,先显示给大家看一些,辛苦大家了
  1. <div class="blockcode"><blockquote>while(true){
  2. temp1 = srcBank.removeAni();//函数中把此岸被设置没人
  3. //对岸增加动物,自动设置对岸有人
  4. destBank.addAni(temp1);
  5. //打印信息
  6. System.out.println("河岸----------------->对岸(人在对岸)");
  7. System.out.println("河岸上动物个数:"+srcBank.getBankAnimals().size());
  8. System.out.print(srcBank.isHasHuman()? "有人:":"没人:"+" ");
  9. for(Animal animal:srcBank.getBankAnimals()){
  10. System.out.print(animal.getName()+" ");
  11. }
  12. System.out.println();
  13. System.out.println("对岸上动物个数:"+destBank.getBankAnimals().size());
  14. System.out.print(destBank.isHasHuman()? "有人:":"没人:"+" ");
  15. for(Animal animal:destBank.getBankAnimals()){
  16. System.out.print(animal.getName()+" ");
  17. }
  18. System.out.println();
  19. if(destBank.getBankAnimals().size() == 3){ //对岸动物数量达到三个,结束
  20. System.out.println();
  21. System.out.println("-----全部通过河岸-----");
  22. break;
  23. }

  24. /****如果从对岸离开后对岸不安全,带走一个动物到河岸****/
  25. if(!destBank.noHumanisSafe()){
  26. temp2 = destBank.removeAni();
  27. srcBank.addAni(temp2); //把从对岸带回来的动物添加到河岸,设置有人
  28. //打印信息
  29. System.out.println();
  30. System.out.println("对岸----------------->河岸()人在河岸");
  31. System.out.println("河岸上动物个数:"+srcBank.getBankAnimals().size());
  32. System.out.print(srcBank.isHasHuman()? "有人:":"没人:"+" ");
  33. for(Animal animal:srcBank.getBankAnimals()){
  34. System.out.print(animal.getName()+" ");
  35. }
  36. System.out.println();
  37. System.out.println("对岸上动物个数:"+destBank.getBankAnimals().size());
  38. System.out.print(destBank.isHasHuman()? "有人:":"没人:"+" ");
  39. for(Animal animal:destBank.getBankAnimals()){
  40. System.out.print(animal.getName()+" ");
  41. }
  42. System.out.println();
  43. }
  44. System.out.println();
  45. }
复制代码

截图:



作者: 孙小亚    时间: 2014-8-23 22:28
自己顶一个!
作者: 孙小亚    时间: 2014-8-24 11:33
人呢!!?:'(
作者: 孙小亚    时间: 2014-8-24 12:05
写得挺好的,就是代码还需要优化。。。
作者: sun354607507    时间: 2014-8-24 12:07
嘻嘻,支持一下,自己顶了三次真不容易:lol
作者: WOLFIE    时间: 2014-8-24 15:36
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
作者: 孙小亚    时间: 2014-8-24 15:46
WOLFIE 发表于 2014-8-24 15:36
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

感谢。。。
作者: Mokill0911    时间: 2014-8-24 16:42
孙小亚 发表于 2014-8-24 11:33
人呢!!?

嘛…… 我眼神不太好,鼓着眼睛看了三遍……

提一点看起来像是找茬的建议,别见怪哈;

函数名太长,重复语句过多,你总共176行代码,Animal这个单词就有71个……

所以我看到一半实在放弃了。

大致看出来是使用了集合的思想,然后设置了动物类和岸类,并且把遭遇天敌和人是否在场的方法封装到了对应的类中……剩下的就……

能说说你的基本思路么……{:3_62:}
作者: 孙小亚    时间: 2014-8-24 17:39
Mokill0911 发表于 2014-8-24 16:42
嘛…… 我眼神不太好,鼓着眼睛看了三遍……

提一点看起来像是找茬的建议,别见怪哈;

首先谢谢你,欢迎找茬,之前有人上传的代码,我看了一下也是闲太麻烦了,200多行呢,我是新手啦,问题尽管指出,不会介意的,我这个可能名字命名有点问题吧,但是思路还是很明确的,
分别有:Animal类,Bank类、AnimalCrossRiver类,理解我写的每个类都有哪些属性和方法就显而易见了。
作者: 孙小亚    时间: 2014-8-24 17:41
Mokill0911 发表于 2014-8-24 16:42
嘛…… 我眼神不太好,鼓着眼睛看了三遍……

提一点看起来像是找茬的建议,别见怪哈;

打印信息那边应该写在一个方法里面的,那样就看上去舒服多了
作者: 天邃任我桓    时间: 2014-8-24 21:46
顶楼主,作为新人虽然看不懂什么,但是很钦佩楼主的精神!
作者: 孙小亚    时间: 2014-8-24 22:29
天邃任我桓 发表于 2014-8-24 21:46
顶楼主,作为新人虽然看不懂什么,但是很钦佩楼主的精神!

谢啦,加油加油!!
作者: tonglingwang    时间: 2014-8-25 22:26
表示这道题不太懂,正在学习中
作者: 孙小亚    时间: 2014-8-26 16:29
tonglingwang 发表于 2014-8-25 22:26
表示这道题不太懂,正在学习中

加油!!!
作者: nadax    时间: 2014-8-26 19:32
貌似用的apple。。。。楼主写的还是挺需要眼神的。我优化完代码到73行。楼主的这个逻辑还是很清楚的,还有优化空间
作者: 孙小亚    时间: 2014-8-27 20:05
nadax 发表于 2014-8-26 19:32
貌似用的apple。。。。楼主写的还是挺需要眼神的。我优化完代码到73行。楼主的这个逻辑还是很清楚的,还有 ...

不是apple,是最新版的Eclipse,它有个黑色主题
作者: 孙雯    时间: 2014-9-1 22:11
我自己想了一下,完全没有思路啊~~~感觉好难无解的样子。我想问一下LZ哈,你当初最开始做的时候,是怎么想的呢?可不可以分享一下呢?
作者: 孙小亚    时间: 2014-9-2 22:46
孙雯 发表于 2014-9-1 22:11
我自己想了一下,完全没有思路啊~~~感觉好难无解的样子。我想问一下LZ哈,你当初最开始做的时候,是怎么想 ...

首先知道要怎么才能过河,然后思考怎样设计类以及类的相关属性和方法。
我是这样设计的:
动物类Animal:属性有name、naturalEnemy(天敌);
河岸Bank类:属性:List<Animal> bankAnimals,hasHuman,isSafe,
主要方法:public boolean noHumanisSafe()(没人是否安全)、添加动物类和删除动物类
主类AnimalCrossRiver:srcBank、destBank;

自己多看看吧。也可以考虑把人当动物看待,这样可以更方便点,要重新设计类。
作者: 迷失的独白    时间: 2014-9-2 23:18
怎么感觉好几个地方都瞅着那么眼熟呢?
  1. import java.util.ArrayList;
  2. public class Crossing {
  3.         public static void main(String[] args) {
  4.                 ArrayList<Animal> riverBank = new ArrayList<Animal>();
  5.                 ArrayList<Animal> oppositeBank = new ArrayList<Animal>();
  6.                 new RiverCrossing(new AddPet().pet(riverBank), oppositeBank).riverCrossing();
  7.                 for(Animal pet : oppositeBank){
  8.                         System.out.println(pet.getName());
  9.                 }
  10.         }
  11. }
  12. class AddPet{
  13.         public ArrayList<Animal> pet(ArrayList<Animal> riverBank) {
  14.                 riverBank.add(new Animal("狗", "猫"));
  15.                 riverBank.add(new Animal("猫", "狗"));
  16.                 riverBank.add(new Animal("鱼", "猫"));
  17.                 return riverBank;
  18.         }
  19. }
  20. class RiverCrossing{       
  21.         private ArrayList<Animal> riverBank = null;
  22.         private ArrayList<Animal> oppositeBank = null;
  23.         private ArrayList<Animal> temp = new ArrayList<Animal>();               
  24.         public RiverCrossing(ArrayList<Animal> riverBank,ArrayList<Animal> oppositeBank) {
  25.                 this.riverBank = riverBank;
  26.                 this.oppositeBank = oppositeBank;
  27.                 this.temp.addAll(this.riverBank);
  28. }       
  29.         private void initialization() {
  30.                 riverBank.clear();
  31.                 oppositeBank.clear();
  32.                 this.riverBank.addAll(temp);
  33.         }
  34.         public void riverCrossing() {
  35.                 move(oppositeBank,riverBank,0);
  36.                 int count = 0;
  37.                 while (true){
  38.                         if (riverBank.size() == 2){
  39.                                 count++;
  40.                                 if (riverBank.get(0).getEnemy().equals(riverBank.get(1).getName()) || riverBank.get(1).getEnemy().equals(riverBank.get(0).getName())){
  41.                                         if ((riverBank.get(0).isFlag() == riverBank.get(1).isFlag()) && !riverBank.get(0).isFlag()){
  42.                                                         initialization();
  43.                                                         move(oppositeBank,riverBank,count);                                               
  44.                                         } else{
  45.                                                 move(oppositeBank,riverBank,0);
  46.                                         }
  47.                                 } else{
  48.                                         riverBank.get(0).setFlag(true);
  49.                                         riverBank.get(1).setFlag(true);
  50.                                         move(oppositeBank,riverBank,1);
  51.                                 }
  52.                         } else{
  53.                                 if (oppositeBank.size() == 2){
  54.                                         if ((oppositeBank.get(0).getEnemy().equals(oppositeBank.get(1).getName())|| oppositeBank.get(1).getEnemy().equals(oppositeBank.get(0).getName())) && (oppositeBank.get(0).isFlag() != oppositeBank.get(1).isFlag())){
  55.                                                         move(riverBank,oppositeBank,0);
  56.                                         }
  57.                                         else{
  58.                                                 if ((oppositeBank.get(0).isFlag() == oppositeBank.get(1).isFlag()) && oppositeBank.get(0).isFlag())        {
  59.                                                                 move(oppositeBank,riverBank,0);
  60.                                                                 System.out.println("河岸有" + riverBank.size() + "只动物");
  61.                                                                 System.out.println("对岸有" + oppositeBank.size()        + "只动物");
  62.                                                                 System.out.println("过河结束");
  63.                                                                 break;
  64.                                                 }
  65.                                         }
  66.                                 }
  67.                         }
  68.                 }
  69.         }
  70.         private void move(ArrayList<Animal> cross,ArrayList<Animal> clear,int index){
  71.                 cross.add(clear.remove(index));
  72.         }
  73. }
  74. class Animal {
  75.         private String name;
  76.         private String enemy;
  77.         private boolean flag = false;
  78.         public Animal(String name, String enemy) {
  79.                 this.name = name;
  80.                 this.enemy = enemy;
  81.         }
  82.         public String getName() {
  83.                 return name;
  84.         }
  85.         public String getEnemy() {
  86.                 return enemy;
  87.         }
  88.         public boolean isFlag() {
  89.                 return flag;
  90.         }
  91.         public void setFlag(boolean flag) {
  92.                 this.flag = flag;
  93.         }
  94. }
复制代码

作者: 孙小亚    时间: 2014-9-3 14:30
迷失的独白 发表于 2014-9-2 23:18
怎么感觉好几个地方都瞅着那么眼熟呢?

这段代码我见过,觉得写得繁琐一点,后来我自己思考了,重新写了一下
作者: xiayoutianxia    时间: 2014-9-4 13:54
顶!!!!!!!!
作者: lvc    时间: 2014-9-5 00:43
  1. package exam;

  2. /*
  3. * 10、 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  4. * 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不
  5. * 会发生这种问题。编程解决猫狗鱼过河问题。
  6. * */
  7. public class Test10 {
  8.         public static void main(String[] args)// throws Exception
  9.         {
  10.                 GoRiver goriver = GoRiver.getRiver();
  11.                 /*
  12.                  * goriver.nounRiver("猫"); goriver.nounRiver("狗");
  13.                  * goriver.southRiver("猫"); goriver.nounRiver("鱼");
  14.                  * goriver.nounRiver("猫"); goriver.getArray();
  15.                  */
  16.                 goriver.nounRiver("狗");
  17.                 goriver.southRiver("猫");
  18.                 goriver.nounRiver("鱼");
  19.                 goriver.nounRiver("猫");
  20.                 goriver.getArray();
  21.         }
  22. }

  23. class GoRiver {
  24.         private static GoRiver river = new GoRiver();

  25.         private GoRiver() {
  26.         }

  27.         public static GoRiver getRiver() {
  28.                 return river;
  29.         }

  30.         // 北岸
  31.         String[] nounRiverside = { "老农", "猫", "狗", "鱼" };
  32.         // 南岸
  33.         // String[] southRiverside = new String[4];
  34.         String[] southRiverside = { "null", "null", "null", "null" };
  35.         String[] arrayOne = { "猫", "狗" };
  36.         String[] arrayTwo = { "猫", "鱼" };
  37.         boolean exchengErray = true;

  38.         // 北岸到南岸
  39.         public void nounRiver(String str) {
  40.                 boolean excheng = false;
  41.                 int one = 0, two = 0;
  42.                 // System.out.print(str + "1");
  43.                 //固定用数组中的0位来存储老农
  44.                 for (int i = 0; i < nounRiverside.length; i++) {
  45.                         try {
  46.                                 if (nounRiverside[i].equals(str)) {
  47.                                         nounRiverside[i] = "null";
  48.                                         nounRiverside[0] = "null";
  49.                                         excheng = true;
  50.                                 }
  51.                         } catch (Exception e) {
  52.                                 System.out.print("...noun错误1...");
  53.                         }
  54.                         //判断北岸留下的是否符合要求
  55.                         for (int s = 0; s < 2; s++) {
  56.                                 if (arrayOne[s].equals(nounRiverside[i])) {
  57.                                         one++;
  58.                                 }
  59.                                 if (arrayTwo[s].equals(nounRiverside[i])) {
  60.                                         two++;
  61.                                 }
  62.                         }
  63.                         if (one == 2 || two == 2) {
  64.                                 excheng = false;
  65.                                 exchengErray = false;
  66.                                 System.out.println("北岸失败");
  67.                                 break;
  68.                         }
  69.                 }
  70.                 //当符合要求就把存入南岸,下同
  71.                 if (excheng) {
  72.                         try {
  73.                                 for (int j = 0; j < southRiverside.length; j++) {
  74.                                         // System.out.print(str + "2");
  75.                                         southRiverside[0] = "老农";
  76.                                         if (southRiverside[j].equals("null")) {
  77.                                                 southRiverside[j] = str;
  78.                                                 // System.out.print("southRiverside[j]"+southRiverside[j]);
  79.                                                 break;
  80.                                         }
  81.                                 }
  82.                         } catch (Exception e) {
  83.                                 System.out.print("...noun错误2...");
  84.                         }
  85.                 }
  86.         }

  87.         // 南岸到北岸
  88.         public void southRiver(String str) {
  89.                 boolean excheng = false;
  90.                 int one = 0, two = 0;
  91.                 // System.out.print(str + "3");
  92.                 for (int i = 0; i < southRiverside.length; i++) {
  93.                         try {
  94.                                 if (southRiverside[i].equals(str)) {
  95.                                         southRiverside[i] = "null";
  96.                                         southRiverside[0] = "null";
  97.                                         excheng = true;
  98.                                 }
  99.                         } catch (Exception e) {
  100.                                 System.out.print("...south错误1...");
  101.                         }
  102.                         // 判断南岸留下的是否符合要求
  103.                         for (int s = 0; s < 2; s++) {
  104.                                 if (arrayOne[s].equals(nounRiverside[i])) {
  105.                                         one++;
  106.                                 }
  107.                                 if (arrayTwo[s].equals(nounRiverside[i])) {
  108.                                         two++;
  109.                                 }
  110.                         }
  111.                         if (one == 2 || two == 2) {
  112.                                 excheng = false;
  113.                                 exchengErray = false;
  114.                                 System.out.println("南岸失败");
  115.                                 break;
  116.                         }
  117.                 }
  118.                 if (excheng) {
  119.                         try {
  120.                                 for (int j = 0; j < nounRiverside.length; j++) {
  121.                                         nounRiverside[0] = "老农";
  122.                                         if (nounRiverside[j].equals("null")) {
  123.                                                 nounRiverside[j] = str;
  124.                                                 break;
  125.                                         }
  126.                                 }
  127.                         } catch (Exception e) {
  128.                                 System.out.print("...south错误...");
  129.                         }
  130.                 }
  131.         }

  132.         public void getArray() {
  133.                 if (exchengErray) {
  134.                         for (int i = 0; i < southRiverside.length; i++) {
  135.                                 System.out.println(southRiverside[i] + "过河成功");

  136.                         }
  137.                 } else {
  138.                         System.out.println("过河失败");
  139.                 }
  140.         }

  141. }
复制代码

作者: lvc    时间: 2014-9-5 00:47
自己写的,没有优化。还是没有突出面向对象编程。看了楼主代码,哎。。,与他相差太远。
作者: xiayoutianxia    时间: 2014-9-5 08:58
基础测试里有这个么?
作者: 孙雯    时间: 2014-9-5 23:22
孙小亚 发表于 2014-9-2 22:46
首先知道要怎么才能过河,然后思考怎样设计类以及类的相关属性和方法。
我是这样设计的:
动物类Animal: ...

谢谢您~我自己在多琢磨琢磨O(∩_∩)O~
作者: 孙小亚    时间: 2014-9-6 16:53
xiayoutianxia 发表于 2014-9-5 08:58
基础测试里有这个么?

有的人的基础题里面有。
作者: 刃下心    时间: 2014-9-7 01:17
挺有意思的
作者: 孙小亚    时间: 2014-9-7 22:55
刃下心 发表于 2014-9-7 01:17
挺有意思的

:):):):):)




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