论坛首页 Java企业应用论坛

百度面试题---5只蚂蚁走木棍问题的非递归解法(java实现)

浏览 10991 次
精华帖 (3) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2009-07-14  
太简单了,最短距离11  最长27
你的算法是错误的
其实你思考下,求最短时 11 和17的两边往外走 最久11秒
最长就更简单了 同时往一边走
0 请登录后投票
   发表时间:2009-07-14  
挪威的幽灵 写道
太简单了,最短距离11  最长27
你的算法是错误的
其实你思考下,求最短时 11 和17的两边往外走 最久11秒
最长就更简单了 同时往一边走

i am wrong????  no   .no..... you r wrong...

please see it carefully again.

shorest  11     and longest 24...
0 请登录后投票
   发表时间:2009-07-17  
我怎么觉得最长时间是23
0 请登录后投票
   发表时间:2009-07-17  
我觉得这个帖子中关于这个问题的程序最简洁
http://www.iteye.com/topic/417157
0 请登录后投票
   发表时间:2009-07-25  
这题其实有一种很方便的解法, 记得有人叫它灵魂算法
两只蚂蚁相遇并掉头,完全可以看成是两头蚂蚁穿过对方

最小时间
离中心最近的蚂蚁 向 离自己近的一棍头跑, 就是最短时间

最长时间
离棍头最短的蚂蚁, 向 离自己远的一头跑, 就是最长时间了

应该就是如此了
0 请登录后投票
   发表时间:2009-07-29  
chirking 写道
“当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。“
其实你可以当作它们擦肩而过。
所以,最长时间应该是 最左短端的蚂蚁一直往右走 和 最右短端的蚂蚁一直往左走 两个时间的最大值。(不考虑别的蚂蚁,一直走就对了)
最小时间应该是 左边的3个蚂蚁往左走,右边的2个蚂蚁往右走 花的时间。
你可以试试。

确实很厉害,一语中的!!
0 请登录后投票
   发表时间:2009-07-29  
min:23
max:51

我算出来的
0 请登录后投票
   发表时间:2009-07-29  
lianxianghui 写道
我觉得这个帖子中关于这个问题的程序最简洁
http://www.iteye.com/topic/417157

那个算出来答案不靠谱啊
0 请登录后投票
   发表时间:2009-07-29   最后修改:2009-07-29
打印出所有方式所花费的时间,时间晚了代码没整理,欢迎批评及质疑!

 package com;

public class TestAntWalk {
	int lenth;

	int antNum;

	int speed;

	int[] antPos ;

	// 蚂蚁数组,第一维:方向 ;第二维:位置;
	int[][] ants;

	public TestAntWalk(int lenth, int[] antPos, int speed) {
		this.lenth = lenth;
		this.antPos = antPos;
		this.antNum = antPos.length;
		this.speed = speed;
		ants = new int[antNum][2];
	}

	public void antWalk() {
		int walkWayNum = 1 << antNum;
		// 遍历蚂蚁前进方向数组
		for (int i = 0; i < walkWayNum; i++) {
			int[] seq = new int[antNum];
			// 生成方向排序序列
			for (int j = 0; j < antNum; j++) {
				seq[j] = (i >> (antNum - 1 - j)) % 2;
			}
			// 蚂蚁数组填充
			for (int j = 0; j < antNum; j++) {
				ants[j][0] = seq[j];
				ants[j][1] = antPos[j];
			}
			// 完成蚂蚁数量
			int overNum = 0;
			int time = 0;
			while (overNum < antNum) {
				// 碰头换方向
				for (int j = 0; j < antNum - 1; j++) {
					if (ants[j][1] == ants[j + 1][1]
							&& ants[j][0] != ants[j + 1][0]) {
						ants[j][1] = ants[j][1] + ants[j + 1][1];
						ants[j + 1][1] = ants[j][1] - ants[j + 1][1];
						ants[j][1] = ants[j][1] - ants[j + 1][1];
					}
				}

				// 蚂蚁前进
				for (int j = 0; j < antNum; j++) {
					if ((ants[j][1] == 0 || ants[j][1] == lenth)
							&& ants[j][0] != -1) {
						overNum++;
						ants[j][0] = -1;
					} else {
						if (ants[j][0] == 1) {
							ants[j][1] = ants[j][1] + speed;
						} else if (ants[j][0] == 0) {
							ants[j][1] = ants[j][1] - speed;
						}
					}

				}
				time++;
			}
			time--;
			System.out.println("....." + i + "..:" + time);
		}

	}

	public static void main(String[] args) {
		TestAntWalk antWalk = new TestAntWalk(27, new int[] { 3, 7, 11, 17, 23 }, 1);
		antWalk.antWalk();
	}
}
0 请登录后投票
   发表时间:2009-08-20  
jltest 写道
lianxianghui 写道
我觉得这个帖子中关于这个问题的程序最简洁
http://www.iteye.com/topic/417157

那个算出来答案不靠谱啊


运行结果是 24 和 11 ,你的23是错的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics