有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、18厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
要求:用类模拟出蚂蚁的行为特性,进而模拟出五只蚂蚁在木杆上的运行过程来编程求解。不能通过数学的方式直接用公式计算。
public class Ant {
private int pos;//蚂蚁的位置,每种情况开始走之前要初始化位置
private boolean isLeft=true;//默认左
private boolean isDown=false;//在细杆上
private static int num;//蚂蚁数目
private static int numOfDown=0;//在线记录每种情况有多少只蚂蚁已经离开
private static int LEFT_END=0;//标记细杆的左端位置
private static int RIGHT_END=27;//标记细杆的右端位置
private static int minTime=Integer.MAX_VALUE,maxTime,time;//标记最小最大时间,以及每种情况走的时间
public Ant(int pos) {
//构造函数
this.pos = pos;
}
public void step(int i){
//蚂蚁怎样走
if(!isDown){
//判断蚂蚁是否在杆上
if(isLeft){
//向左向右走并记录时间
pos-=i;
}else{
pos+=i;
}
if(pos<=LEFT_END||pos>=RIGHT_END){
//判断蚂蚁离开杆
isDown=true;//标记已不在细杆上
numOfDown++;//离开的蚂蚁数量加1
if(numOfDown==num){
//如故所有的蚂蚁离开
if(minTime>time){
minTime=time;//判断是不是最小时间
}
if(maxTime<time){
//判断是不是最大时间
maxTime=time;
}
// System.out.println("all down........minTime:"+minTime+",maxTime:"+maxTime);//每种情况标记此种情况已走完,并输出时间
}
}
}
}
public static void setNum(int num) {
//设置蚂蚁总数
Ant.num = num;
}
public int getPos() {
//获得蚂蚁位置,是否碰头或者撞头
return pos;
}
public void setPos(int pos) {
//每种情况初始化蚂蚁的位置
this.pos = pos;
}
public boolean isLeft() {
//判断蚂蚁是否会碰头,撞头
return isLeft;
}
public void setLeft(boolean isLeft) {
//对于每种情况蚂蚁的走向的设置,对碰头和撞头的处理
this.isLeft = isLeft;
}
public boolean isIsDown() {
//判断蚂蚁在线不
return isDown;
}
public void setIsDown(boolean isDown) {
//每种情况初始化为在线
this.isDown = isDown;
}
public static boolean isOver() {
//判断蚂蚁是否全部离开细杆
return numOfDown==num;
}
public static void setNumOfDown(int numOfDown) {
//初始化离杆蚂蚁的数量
Ant.numOfDown = numOfDown;
}
public static void setTime(int time) {
//初始化每种情况的时间
Ant.time = time;
}
public void turnAround(){
//撞头或碰头时的转向
isLeft=!isLeft;
}
public static int getMinTime() {
//用于所有情况走完输出最大最小时间
return minTime;
}
public static int getMaxTime() {
return maxTime;
}
public static void timeGo(){
time++;
}
}
public class AntRun {
public static void