問題描述
用二維陣列表示地圖,若值為 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 回走記錄路徑 從終點往回走,每次只走到比當前位置與開始點...