C 電路佈線 最短路徑問題

2022-01-18 10:28:16 字數 4463 閱讀 4413

問題描述

用二維陣列表示地圖,若值為 1 則表示有障礙物,若值為 0 則表示可以通行。

輸入: m*n 的二維陣列,佈線起點座標,佈線終點座標。

輸出: 最短佈線距離以及對應的佈線路徑。

問題分析

從起點開始佈線,將起點標記為 0 ,把四周可佈線的位置標記為 起點標記值 + 1 ,同時將這些點插進佇列 q (插到隊尾)。

從 q 中取出乙個點(隊首元素)重複佈線動作,將可佈線位置標記為 取出點標記值 + 1 ,並插進 q 。不斷重複上乙個動作,直到找到終點,此時終點的標記值即最短佈線距離。

為什麼終點的標記值會等於最短佈線距離呢?

事實上對於每一點這個結論都是成立的(某點的標記值=該點到起點的最短距離)。

(方塊表示起點,橢圓表示終點)

在佈線的過程中,始終遵循的規則是:標記值越小的越先佈線。(越先入隊的越先佈線)

我們假設對於標記值為 n 的點該結論成立,我們只需要證明從標記值為 n 的點出發,找到的標記值為 n+1 的點確實最短就可以了。

我們考察標記值 n 周圍的可佈線點,可以分為兩類:已佈線點和未佈線點。

對於未佈線的點:由佈線規則可知,所有標記值 < n 點都已經佈線完畢,點未被佈線的唯一原因是任何乙個標記值 < n 的點都無法與它相鄰(到不了或者需要付出更大的代價才能到),所以該點只能通過點 n 或者相鄰的標記值同樣為 n 的點與起點聯通,從而取得最小值,故對標記值為 n+1 的點結論同樣成立。

因此該結論對於任意標記值的點都成立。

或者,一句話說就是迷宮格仔形成了一顆bfs樹,事實上我們已經把所有更短的路徑都search出來了。所以不可能有更短的。

} //初始化

f(map, s, e, k, p);

if(k)

else

return0;

}附件:迷宮問題

上面那道題用佇列,這道用棧。

#include #define max 7

struct

point

point(

int x, int

y): x(x), y(y) {}

void setposition(int x, int

y) };

point p[max][max];

bool seekpath(int (*map)[max], point& s, point&e)

//printf("seekpath:1\n");

if (s.x+1

< max && map[s.x+1][s.y] != 1 && !p[s.x+1][s.y].mark && seekpath(map, p[s.x+1

][s.y], e))

//printf("seekpath:2\n");

if (s.x-1 >= 0 && map[s.x-1][s.y] != 1 && !p[s.x-1][s.y].mark && seekpath(map, p[s.x-1

][s.y], e))

//printf("seekpath:3\n");

if (s.y+1

< max && map[s.x][s.y+1] != 1 && !p[s.x][s.y+1].mark && seekpath(map, p[s.x][s.y+1

], e))

//printf("seekpath:4\n");

if (s.y-1 >= 0 && map[s.x][s.y-1] != 1 && !p[s.x][s.y-1].mark && seekpath(map, p[s.x][s.y-1

], e))

//printf("seekpath:5\n");

if (s.x+1

< max && s.y+1

< max && map[s.x+1][s.y+1] != 1 && !p[s.x+1][s.y+1].mark && seekpath(map, p[s.x+1][s.y+1

], e))

//printf("seekpath:6\n");

if (s.x+1

< max && s.y-1 >= 0 && map[s.x+1][s.y-1] != 1 && !p[s.x+1][s.y-1].mark && seekpath(map, p[s.x+1][s.y-1

], e))

//printf("seekpath:7\n");

if (s.x-1 >= 0 && s.y+1

< max && map[s.x-1][s.y+1] != 1 && !p[s.x-1][s.y+1].mark && seekpath(map, p[s.x-1][s.y+1

], e))

//printf("seekpath:8\n");

if (s.x-1 >= 0 && s.y-1 >= 0 && map[s.x-1][s.y-1] != 1 && !p[s.x-1][s.y-1].mark && seekpath(map, p[s.x-1][s.y-1

], e))

return

false;}

void f(int (*map)[max], point& s, point&e)

}//work

if (!seekpath(map, s, e))

//printf("f:runnable\n");

}int

main()

; point s(

0, 0

); point e(

2, 6

);

f(map, s, e);

//printf("main:runnable\n");

return0;

}

留著備用。

尋找電路佈線最短路徑 Queue

bool findpath position start,position finish,int pathlen,position path 初始化包圍網格的圍牆 for int i 0 i m 1 i 初始化offset position offset 4 offset 0 row 0 offse...

求解最短路徑之電路佈線

a和b之間的最短路徑需要在兩個過程中確定。乙個是距離標記過程,另乙個是路徑標記過程。在距離標記過程中,先從位置a開始,把從a可到達的相鄰方格都標記為1 表示與a相距為1 然後把從編號為1的方格可到達的相鄰方格都標記為2 表示也a相鄰為2 這個標記過程繼續下去直到到達b或者沒有可到達相鄰方格為止。距離...

尋找電路佈線最短路徑演算法BFS

問題定義 將佈線區域劃分成一格n m的網格,網格內用 1來標識障礙點,求網格內一點到另一點之間的最短路徑。思想 1 標記距離 先用bfs的方法將網格做個標記,在經過每個的點的位置上記錄一下該點到初始點start之間的距離,一直到終點end。2 回走記錄路徑 從終點往回走,每次只走到比當前位置與開始點...