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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙小亚 中级黑马   /  2014-8-23 19:41  /  2897 人查看  /  27 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

最近看到好几个帖子都是关于农民带狗猫鱼过河的基础测试题,后来自己也尝试练了一下,纯手写的哦!给大家看看,顺便附上截图,给给建议。。。题目:

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


代码: 农民带狗、猫、鱼过河(代码 结果截图).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. }
复制代码

截图:


27 个回复

倒序浏览
自己顶一个!
回复 使用道具 举报
人呢!!?:'(
回复 使用道具 举报
写得挺好的,就是代码还需要优化。。。
回复 使用道具 举报
嘻嘻,支持一下,自己顶了三次真不容易:lol
回复 使用道具 举报
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
回复 使用道具 举报
WOLFIE 发表于 2014-8-24 15:36
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

感谢。。。
回复 使用道具 举报

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

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

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

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

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

能说说你的基本思路么……{:3_62:}
回复 使用道具 举报
Mokill0911 发表于 2014-8-24 16:42
嘛…… 我眼神不太好,鼓着眼睛看了三遍……

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

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

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

打印信息那边应该写在一个方法里面的,那样就看上去舒服多了
回复 使用道具 举报
顶楼主,作为新人虽然看不懂什么,但是很钦佩楼主的精神!
回复 使用道具 举报
天邃任我桓 发表于 2014-8-24 21:46
顶楼主,作为新人虽然看不懂什么,但是很钦佩楼主的精神!

谢啦,加油加油!!
回复 使用道具 举报
表示这道题不太懂,正在学习中
回复 使用道具 举报
tonglingwang 发表于 2014-8-25 22:26
表示这道题不太懂,正在学习中

加油!!!
回复 使用道具 举报
nadax 中级黑马 2014-8-26 19:32:13
15#
貌似用的apple。。。。楼主写的还是挺需要眼神的。我优化完代码到73行。楼主的这个逻辑还是很清楚的,还有优化空间
回复 使用道具 举报
nadax 发表于 2014-8-26 19:32
貌似用的apple。。。。楼主写的还是挺需要眼神的。我优化完代码到73行。楼主的这个逻辑还是很清楚的,还有 ...

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

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

自己多看看吧。也可以考虑把人当动物看待,这样可以更方便点,要重新设计类。
回复 使用道具 举报
怎么感觉好几个地方都瞅着那么眼熟呢?
  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-2 23:18
怎么感觉好几个地方都瞅着那么眼熟呢?

这段代码我见过,觉得写得繁琐一点,后来我自己思考了,重新写了一下
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马