螞蟻爬杆問題的java實現


/**
* Filename: com.yangphere.demo.AntWalker.java
* Description: 題目描述: 有一根27釐米的細木杆, 在第3釐米、7釐米、11釐米、17釐米、23釐米這五個位置上各有一隻螞蟻。 木杆很細,不能同時通過一隻螞蟻。
* 開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。 當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。
* 假設螞蟻們每秒鐘可以走一釐米的距離。 編寫程序,求所有螞蟻都離開木杆的最小時間和最大時間。
* Copyright: Copyright (c)2009
* Company: yangphere
* @author: yangphere
* @version: 1.0
* Create at: 2009-6-28
*
* Modification History:
* Date Author Version Description
* ------------------------------------------------------------------
* 2009-6-28 yangphere 1.0 1.0 Version
*/
package com.yangphere.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* 配合邏輯分析給出一種簡單的實現方式
* 其中有個很重要的原則是:當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走,其實和假設兩隻螞蟻之間可以無障礙穿過時是一樣的(忽略螞蟻自身的長度)。
*
* @author yangphere
*
*/
public class AntWalker {

/**
* 細木杆長度
*/
private static final int TOTAL_LENGTH = 27;

/**
* 螞蟻的位置
*/
private static final List<Integer> ANT_PER_POSITION = new ArrayList<Integer>();

/**
* 初始化螞蟻位置
*/
static {
ANT_PER_POSITION.add(3);
ANT_PER_POSITION.add(7);
ANT_PER_POSITION.add(11);
ANT_PER_POSITION.add(17);
ANT_PER_POSITION.add(23);
}

/**
*
* @author yangphere 2009-6-28
* @param args
*/
public static void main(String[] args) {
if (!check()) {
System.out.println("參數錯誤!");
} else {
System.out.println("最短時間是:" + getMinTime() + "秒");
System.out.println("最長時間是:" + getMaxTime() + "秒");
}
}

/**
* 獲得最長時間 根據那個原則,無需關心螞蟻碰撞的問題,最長時間就是所有螞蟻中距細杆一端最長的那隻螞蟻的爬完時間
*
* @author yangphere 2009-6-29
* @return
*/
private static int getMaxTime() {
// 對螞蟻位置排序
Collections.sort(ANT_PER_POSITION);
// 獲得最靠兩端的螞蟻
int oneSide = ANT_PER_POSITION.get(0);
int anotherSide = ANT_PER_POSITION.get(ANT_PER_POSITION.size() - 1);

// 獲得一隻螞蟻距兩端最長的距離
int oneMax = (oneSide > (TOTAL_LENGTH - oneSide)) ? oneSide
: TOTAL_LENGTH - oneSide;
int antherMax = (anotherSide > (TOTAL_LENGTH - anotherSide)) ? anotherSide
: TOTAL_LENGTH - anotherSide;

return oneMax > antherMax ? oneMax : antherMax;
}

/**
* 獲得最短時間 根據那個原則,最短時間就是距細杆中間最近的那隻螞蟻爬完細杆最短的那端所花的時間
*
* @author yangphere 2009-6-29
* @return
*/
private static int getMinTime() {

// 螞蟻距一端的距離
int oneSide = getNearCenterAnt();

// 螞蟻距另一段的距離
int anotherSide = TOTAL_LENGTH - oneSide;

return oneSide < anotherSide ? oneSide : anotherSide;
}

/**
* 獲得最接近細杆中間的螞蟻
*
* @author yangphere 2009-6-29
* @return
*/
private static int getNearCenterAnt() {
// 中間位置
double center = TOTAL_LENGTH / 2.0;
// 離中間最近的螞蟻的位置
int antNearCenter = 0;

Map<Integer, Double> map = new HashMap<Integer, Double>();

double antNearPosition = center - ANT_PER_POSITION.get(0);
for (Integer ant : ANT_PER_POSITION) {
antNearPosition = antNearPosition < Math.abs(center - ant) ? antNearPosition
: Math.abs(center - ant);

map.put(ant, Math.abs(center - ant));
}

Set<Integer> set = map.keySet();
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
Integer key = (Integer) iterator.next();
if (antNearPosition == map.get(key)) {
antNearCenter = key;
break;
}
}

return antNearCenter;
}

/**
* 檢查參數的正確性
*
* @author yangphere 2009-6-29
* @return
*/
private static boolean check() {
if (TOTAL_LENGTH <= 0) {
return false;
} else if (ANT_PER_POSITION.size() <= 0) {
return false;
}

// 站在杆外
for (Integer ant : ANT_PER_POSITION) {

if (ant <= 0) {
return false;
} else if (ant > TOTAL_LENGTH) {
return false;
}
}

return true;
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章