- 论坛徽章:
- 0
|
蚂蚁问题
- public class Test {
- //初始时任意相邻2只蚂蚁之间的距离都是偶数。
- //每秒钟任意相邻2只蚂蚁之间的距离要么+2,要么-2,要么不变
- //因此任意相邻2只蚂蚁在碰头的所经历的时间必定是整数秒。
- //因此可以每秒钟查询一次6只蚂蚁的状态。
- public static void main(String[] args) {
- //初始化 5只蚂蚁,-1表示向左,1表示向右,
- //直观感觉最小时间应该是-1,-1,-1,1,1。其他情况就不测试了。
- int[] orientations = {-1,-1,-1,+1,+1};
- Anti[] antis = new Anti[5];
- antis[0] = new Anti();
- antis[1] = new Anti();
- antis[2] = new Anti();
- antis[3] = new Anti();
- antis[4] = new Anti();
- antis[0].init(null, antis[1], 3, 24, orientations[0], true);
- antis[1].init(antis[0], antis[2], 7, 20, orientations[1], true);
- antis[2].init(antis[1], antis[3], 11, 16, orientations[2], true);
- antis[3].init(antis[2], antis[4], 17, 10, orientations[3], true);
- antis[4].init(antis[3], null, 23, 4, orientations[4], true);
-
- int i = 0;
- for (;;i++) {//每秒轮询
- boolean isDone = true;;
- for (Anti anti : antis) {
- if (anti.isOnLine) {
- isDone = false;
- anti.left+=anti.orientation;
- anti.right-=anti.orientation;
- if (anti.left == 0 || anti.right ==0){
- anti.isOnLine = false;
- }
- }
- }
- if (isDone) {
- break;
- }
- for (Anti anti : antis) {
- if (anti.isOnLine) {
- if (anti.leftAnti == null ) {
- if (anti.rightAnti.isOnLine
- && anti.rightAnti.left == anti.left) {
- anti.orientation = anti.orientation *-1;
- }
- } else {
- if (anti.leftAnti.isOnLine
- && anti.leftAnti.left == anti.left) {
- anti.orientation = anti.orientation *-1;
- }
- }
- }
- }
- }
- System.out.printf("当初始方向为%d,%d,%d,%d,%d时,一共%d秒",
- orientations[0],orientations[1],orientations[2],orientations[3],orientations[4],i);
- }
- }
- class Anti {
- Anti leftAnti;
- Anti rightAnti;
- int orientation ;//-1:left, +1:right
- float left;
- float right;
- boolean isOnLine;
-
- public Anti(){
- }
- public void init(Anti leftAnti, Anti rightAnti, float left, float right,
- int orientation, boolean isOnLine) {
- this.leftAnti = leftAnti;
- this.rightAnti = rightAnti;
- this.left = left;
- this.right = right;
- this.orientation = orientation;
- this.isOnLine = isOnLine;
- }
- }
复制代码 遍历可能的初始方向数组可以测试其他情况,然后就可以算出最大最小时间 |
|