送快遞的最短路徑
阿新 • • 發佈:2019-01-08
題目描述:某物流派送員p,需要給a、b、c、d4個快遞點派送包裹,請問派送員需要選擇什麼的路線,才能完成最短路程的派送。假設如圖派送員的起點座標(0,0),派送路線只能沿著圖中的方格邊行駛,每個小格都是正方形,且邊長為1,如p到d的距離就是4。隨機輸入n個派送點座標,求輸出最短派送路線值(從起點開始完成n個點派送並回到起始點的距離)。
- 題目分析
首先應該想到的是最笨最常見的做法,那就是列舉法,列出所有的路徑,求出所有距離的最小值。而不應該去企圖從Dijkstra或者是其他的圖演算法那裡找突破口,說明你對圖演算法還了解的不深。這裡很明顯應該回溯窮舉暴力破解,這裡回溯時注意現場的恢復;
- 程式碼實現
static class Point {
int x, y;
public Point(int i, int i1) {
x = i;
y = i1;
}
}
public static void main(String[] args) {
start = new Point(0, 0);
points = new Point[]{new Point(1, 1), new Point(5, 2),
new Point(4, 6), new Point(2, 7)};
System.out.println(minPath());
}
private static int min = Integer.MAX_VALUE; //全域性最小路徑,初始為無窮大
private static Point start; //起點
private static Point[] points; //所有的頂點陣列
/**
* 計算最短路徑的演算法,深搜,回溯等
* @return 返回全域性最小路徑數值
*/
private static int minPath() {
boolean[] b = new boolean[points.length];
int path = 0;
for (int i=0; i<points.length; i++) {
path += getDis(start, points[i]);
dfs(i, path, b, 1, points.length);
}
return min;
}
/**
* 深搜主演算法
* @param index 當前頂點的序號
* @param path 所有距離累加值
* @param b 標記陣列,true則在當前路徑上
* @param level 深搜深度
* @param length 總深度
*/
private static void dfs(int index, int path, boolean[] b, int level, int length) {
if (level == length) {
path += getDis(start, points[index]);
if (path < min) min = path;
return;
}
b[index] = true;
for (int i=0; i<points.length; i++) {
if (!b[i]) {
path += getDis(points[index], points[i]);
dfs (i, path, b, level+1, length);
}
}
b[index] = false;
}
/**
* 由兩個點獲取期間的距離演算法
* @param start
* @param point
* @return
*/
private static int getDis(Point start, Point point) {
return Math.abs(start.x-point.x) + Math.abs(start.y-point.y);
}
- 做題應該先從最容易想到的演算法想起,有時間再考慮優化,除非你對高階演算法已經非常熟悉了。