蚂蚁问题(算法)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值