码迷,mamicode.com
首页 > 其他好文 > 详细

蚂蚁搬家(改进版)

时间:2015-04-14 21:43:53      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:蚂蚁爬杆改进版   模拟二进制加法   

      有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、18厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

 要求:

       用类模拟出蚂蚁的行为特性,进而模拟出五只蚂蚁在木杆上的运行过程来编程求解。不能通过数学的方式直接用公式计算。

解题思路:

        把每个蚂蚁当作一个对象操作,有pos(位置)、direction(走向)、state(状态)属性,只需要在蚂蚁移动的过程中,每移动一次就判断是否走出了杆的长度(0~27),如果走出了范围,马上改变蚂蚁的状态;判断是否有蚂蚁碰面了,如果有碰面,就马上改变蚂蚁的走向。记录时间,输出最大的和最小的。

改进:

       把五个for改进为利用数组处理蚂蚁的走向,模拟一个五位的二进制加法器Add()函数。

代码:

class Main{
   public static void main(String args[]){
       int min=999,max=-999;
       int[] q=new int[]{0,0,0,0,0,0};  //利用数组来确定蚂蚁的走向
       for(int i=0;i<31;i++){	
		       Ant a=new Ant(3);
		       Ant b=new Ant(7);  
		       Ant c=new Ant(11); 
		       Ant d=new Ant(18); 
		       Ant e=new Ant(23);
	         a.direction=q[0];
		       b.direction=q[1];
		       c.direction=q[2];
		       d.direction=q[3];
		       e.direction=q[4];
		       q=Add(q);             //模拟一个加法器          
		       for(int l=0;;l++){
		         a.move();
		         b.move(); 
		         c.move();
		         d.move();
		         e.move();
		         if(a.pos==b.pos){
		         	a.direction*=-1;b.direction*=-1;
		        }
		        if(b.pos==c.pos){
		        	b.direction*=-1;c.direction*=-1;
		        }
		        if(c.pos==d.pos){
		        	c.direction*=-1;d.direction*=-1;
		        }
		        if(d.pos==e.pos){
		        	d.direction*=-1;e.direction*=-1;
		        }
		         //System.out.println(a.state+" "+b.state+" "+c.state+" "+d.state);
		         if((a.state+b.state+c.state+d.state+e.state)==5){
		         	 if(l>max){
		         	 	max=l;
		         	}
		         	if(l<min){
		         		min=l;
		         	}
		         	break;
		        }
		      }
			}
      System.out.println("所有蚂蚁掉下去最小时间是:"+min);
      System.out.println("所有蚂蚁掉下去最大时间是:"+max);
   }
   public static int[] Add(int[] a){    //模拟五位的二进制加法器
   	 a[0]++;                            //每次都在最后的位置加一
   	 for(int i=0;i<5;i++){
   	 	  if(a[i]>1){
   	 	  	 a[i]=0;                   //大于1就归零,向前进位
   	 	  	 a[i+1]++;                 //进位
   	 	  }else{
   	 	  	break;
   	 	  }
   	}
   	return a;
  }
}
class Ant{
	  int pos;
	  int direction;
	  int state=0;
	  public Ant(int pos){
	  	this.pos=pos;
	  }
	  public void move(){
	  	 if(this.pos<=0||this.pos>=27){
	  	 	state=1;
	  	 }
	  	 if(this.direction==0){
	  	 	 this.direction=-1;
	  	}
	  	 this.pos=this.pos+direction;
	  }
}

结果:

      技术分享


蚂蚁搬家(改进版)

标签:蚂蚁爬杆改进版   模拟二进制加法   

原文地址:http://blog.csdn.net/xionghui2013/article/details/45046775

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!