有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的
头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距
离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
public class AntGame {
private int maxTime=0,minTime=99999999;
Ant[] ant=new Ant[5];
Ant head=new Ant(0,0);
public void initDate(int s){
ant[0]=new Ant(3,s%2*2-1);
ant[1]=new Ant(7,s/2%2*2-1);
ant[2]=new Ant(11,s/4%2*2-1);
ant[3]=new Ant(17,s/8%2*2-1);
ant[4]=new Ant(23,s/16%2*2-1);
head.setNext(ant[0]);
for(int i=0;i<4;i++){
ant[i].setNext(ant[i+1]);
}
ant[4].setNext(null);
}
public void findResult(){
Ant checkAnt;
int time;
for(int i=0;i<32;i++){
initDate(i);
display();
time=0;
while(head.getNext()!=null){
checkAnt=head.getNext();
while(checkAnt!=null){
checkAnt.walk();
checkAnt=checkAnt.getNext();
}
checkAnt=head;
while(checkAnt!=null&&checkAnt.getNext()!=null){
if(checkAnt.getNext().posion<=0||checkAnt.getNext().posion>=27){
checkAnt.setNext(checkAnt.getNext().getNext());
checkAnt=checkAnt.getNext();
}
else if(checkAnt.getPosion()==checkAnt.getNext().getPosion()){
checkAnt.back();
checkAnt.getNext().back();
checkAnt=checkAnt.getNext().getNext();
}else
checkAnt=checkAnt.getNext();
}
time++;
}
System.out.println(time);
if(time>maxTime)
maxTime=time;
else if(time<minTime)
minTime=time;
}
System.out.println("minTime:"+minTime+"\tmaxTime:"+maxTime);
}
public void display(){
Ant checkAnt=head.getNext();
while(checkAnt!=null){
System.out.print(checkAnt.getPosion()+" "+checkAnt.getDirection()+"\t");
checkAnt=checkAnt.getNext();
}
//System.out.println();
}
public static void main(String arg[]){
AntGame m=new AntGame();
m.findResult();
}
private class Ant{
private int posion;
private int direction;//1、-1分别代表正反方向
private Ant next;
private int step=1;
public Ant(int posion,int direction){
this.posion=posion;
this.direction=direction;
}
public Ant getNext() {
return next;
}
public void setNext(Ant next) {
this.next = next;
}
public int getPosion() {
return posion;
}
public int getDirection() {
return direction;
}
public void walk(){
posion+=direction*step;
}
public void back(){
direction=(direction+3)%4;
direction--;
//运算后1、-1互换
}
}
}