有一根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;
}
}
结果: