有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
答案:
public class MaYi {
public static void main(String[] args) {
MaYi t = new MaYi();
t.t1();
}
private void t1() {
Ant a1 = new Ant();
Ant a2 = new Ant();
Ant a3 = new Ant();
Ant a4 = new Ant();
Ant a5 = new Ant();
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 2; j++) {
for (int k = 1; k <= 2; k++) {
for (int m = 1; m <= 2; m++) {
for (int n = 1; n <= 2; n++) {
// 做蚂蚁的初始化
a1.direct = i;
a1.site = 3;
a1.alreadyGone = false;
a2.direct = j;
a2.site = 7;
a2.alreadyGone = false;
a3.direct = k;
a3.site = 11;
a3.alreadyGone = false;
a4.direct = m;
a4.site = 17;
a4.alreadyGone = false;
a5.direct = n;
a5.site = 23;
a5.alreadyGone = false;
for (int p = 1; p < 1000; p++) {
// 1:让蚂蚁走,每次走一步
if (!a1.alreadyGone) {
a1.step();
}
if (!a2.alreadyGone) {
a2.step();
}
if (!a3.alreadyGone) {
a3.step();
}
if (!a4.alreadyGone) {
a4.step();
}
if (!a5.alreadyGone) {
a5.step();
}
// 2:判断两只蚂蚁是否会碰头,碰头就都调头
if (a1.site == a2.site && a1.direct == 2
&& a2.direct == 1) {
// 1和2碰头了
a1.changeDirect();
a2.changeDirect();
}
if (a2.site == a3.site && a2.direct == 2
&& a3.direct == 1) {
a2.changeDirect();
a3.changeDirect();
}
if (a3.site == a4.site && a3.direct == 2
&& a4.direct == 1) {
a3.changeDirect();
a4.changeDirect();
}
if (a4.site == a5.site && a4.direct == 2
&& a5.direct == 1) {
a4.changeDirect();
a5.changeDirect();
}
// 3:判断是否已经全部离开
if (a1.alreadyGone && a2.alreadyGone
&& a3.alreadyGone && a4.alreadyGone
&& a5.alreadyGone) {
System.out.println("Over====" + p);
break;
}
}
}
}
}
}
}
}
}
class Ant {
// 用来表示蚂蚁所在的位置
public int site = 0;
// 表示蚂蚁的朝向,1表示向左,2表示向右
public int direct = 1;
// 表示蚂蚁已经离开木杆
public boolean alreadyGone = false;
public void step() {
if (direct == 1) {
site = site - 1;
} else {
site = site + 1;
}
if (site == 0 || site == 27) {
alreadyGone = true;
}
}
public void changeDirect() {
if (direct == 1) {
direct = 2;
} else {
direct = 1;
}
}
}