1. 程式人生 > >送快遞的最短路徑

送快遞的最短路徑

題目描述:某物流派送員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); }

  • 做題應該先從最容易想到的演算法想起,有時間再考慮優化,除非你對高階演算法已經非常熟悉了。