再谈蚂蚁的问题
2011-08-04 14:01
246 查看
今天将前面留的蚂蚁问题解决了,从中的收获那真的是大大的多啊。 虽然这个问题不是完全由我自己解决的(好吧,大部分的思路是从java私塾老师的视频里看到的),但是在我自己编写这个程序的代码得时候我注意了代码的规范行,总体来说可读性比那个老师在视频里领着做的写的代码要好点。以下是代码:
/*1:有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。*/public class MaYi{public static void main(String[] args){MaYi maYi = new MaYi();maYi.antMoveProcess();}public void antMoveProcess(){//创建 5 个 ant对象Ant[] ant = new Ant[5];for(int i=0; i<5; i++){ant[i] = new Ant();}//通过 5 个循环来实现 5个ant实例的随机方向for(int antOneDirection=Ant.LEFT; antOneDirection<=Ant.RIGHT; antOneDirection++){for(int antTwoDirection=Ant.LEFT; antTwoDirection<=Ant.RIGHT; antTwoDirection++){for(int antThreeDirection=Ant.LEFT; antThreeDirection<=Ant.RIGHT; antThreeDirection++){for(int antFourDirection=Ant.LEFT; antFourDirection<=Ant.RIGHT; antFourDirection++){for(int antFiveDirection=Ant.LEFT; antFiveDirection<=Ant.RIGHT; antFiveDirection++){// 初始化 5 个ant实例ant[0].currentSite = 3;ant[0].direction = antOneDirection;ant[0].isLeft = false;ant[1].currentSite = 7;ant[1].direction = antTwoDirection;ant[1].isLeft = false;ant[2].currentSite = 11;ant[2].direction = antThreeDirection;ant[2].isLeft = false;ant[3].currentSite = 17;ant[3].direction = antFourDirection;ant[3].isLeft = false;ant[4].currentSite = 23;ant[4].direction = antFiveDirection;ant[4].isLeft = false;// 通过一个循环来模拟时间 5 个and实例的运动 也是在这个模拟时间内for(int time=1; time<1000; time++){ //注意时间是从1开始的 不能从0开始if(!ant[0].isLeft){ant[0].step();}if(!ant[1].isLeft){ant[1].step();}if(!ant[2].isLeft){ant[2].step();}if(!ant[3].isLeft){ant[3].step();}if(!ant[4].isLeft){ant[4].step();}if((ant[0].currentSite == ant[1].currentSite) && (ant[0].direction == Ant.RIGHT) && ant[1].direction == Ant.LEFT){ant[0].changeDirection();ant[1].changeDirection();}if((ant[1].currentSite == ant[2].currentSite) && (ant[1].direction == Ant.RIGHT) && ant[2].direction == Ant.LEFT){ant[1].changeDirection();ant[2].changeDirection();}if((ant[2].currentSite == ant[3].currentSite) && (ant[2].direction == Ant.RIGHT) && ant[3].direction == Ant.LEFT){ant[2].changeDirection();ant[3].changeDirection();}if((ant[3].currentSite == ant[4].currentSite) && (ant[3].direction == Ant.RIGHT) && ant[4].direction == Ant.LEFT){ant[3].changeDirection();ant[4].changeDirection();}if(ant[0].isLeft && ant[1].isLeft && ant[2].isLeft && ant[3].isLeft && ant[4].isLeft){System.out.println("The Time is " + time);break;}}}}}}}}}class Ant{public static final int LEFT = 1;public static final int RIGHT = 2;public int currentSite;public int direction;public boolean isLeft = false;public void step(){if(direction == LEFT){currentSite = currentSite - 1;}else{currentSite = currentSite + 1;}if((currentSite == 0) || (currentSite == 27)){isLeft = true;}}public void changeDirection(){if(direction == LEFT){direction = RIGHT;}else {direction = LEFT;}}}[/code]
通过这个程序呢,让我真正的感受到什么是面向对象语言,我刚拿到这个题目的时候,还是用面向过程的思维去思考这个题,这就在我写代码的时候脑中一片混乱,无从下手。经过老师的视频讲说我知道了,对待一个问题的时候,要想将问题里得对象弄出来,然后根据提议一点一点的解决它。学习java那么长时间了,面向对象的思想还是没有进入自己的脑子里,这一定要注意。这个代码是根据题目思路来写的,但是如果你仔细的分析题目了以后可以发现,完全可以将两只蚂蚁碰头后调头这个要求去掉,因为不管他们碰不碰头 走的路线都是一样的。所以可以完全将那个changeDirection()函数删除点。这样效率会更高。这也提醒我们,面对一个问题的时候要多加思考,将问题中无关紧要的条件去掉,这样在编写代码的时候能带来很大的方便行。 代码也不会显得啰嗦臃肿。
相关文章推荐
- 编程之美:蚂蚁爬杆问题的扩展
- 蚂蚁爬杆问题
- poj蚂蚁问题
- 7.2---蚂蚁相遇问题(CC150)
- 百度笔度题-----蚂蚁爬杆问题
- 蚂蚁爬木杆问题
- 蚂蚁爬杆问题
- 木杆上的蚂蚁问题
- poj 1852 蚂蚁问题,很经典,实际上就是找最靠近边缘和最靠近中间,靠近边缘要注意小数的处理
- JAVA代码—算法基础:蚂蚁爬行问题
- 木杆上的蚂蚁问题(php版)
- 蚂蚁freeline安装教程以及问题解决
- 问题 1454: [蓝桥杯][历届试题]蚂蚁感冒
- 最大最小蚂蚁的TSP问题的实现
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题(Java面向对象)
- 用matlab处理蚂蚁迷宫问题
- 带精英策略的蚂蚁系统解决TSP问题matlab实现
- 蚂蚁爬行问题及其改编
- POJ 1852 Ants || UVA 10881 - Piotr's Ants 经典的蚂蚁问题