問題定義:
將佈線區域劃分成一格n*m
的網格,網格內用-1
來標識障礙點,求網格內一點到另一點之間的最短路徑。
思想:1、標記距離:
先用bfs的方法將網格做個標記,在經過每個的點的位置上記錄一下該點到初始點start
之間的距離,一直到終點end
。
2、回走記錄路徑:
從終點往回走,每次只走到比當前位置與開始點start
距離小1
的位置,邊走邊記錄路徑。
開始時地圖:(-1表示障礙不能走,0表示能走)
-1 -1 -1 -1 -1 -1 -1 -1 -1
-1 0 0 -1 0 0 0 0 -1
-1 0 0 -1 -1 0 0 0 -1
-1 0 0 0 0 -1 0 0 -1
-1 0 0 0 -1 -1 0 0 -1
-1 -1 0 0 0 -1 0 0 -1
-1 -1 -1 -1 0 0 0 0 -1
-1 -1 -1 -1 0 0 0 0 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1
**:
#include
#include
#include
using namespace std;
const
int m =9;
const
int maxlen =30;
class
point
;int dx[4]
=;//x、y方向上的增量 上右下左
int dy[4]
=;void
findpath
(int g[
][m]
,point start,point finish,
int& pathlen,point* path)
point cur,next;
g[start.x]
[start.y]=1
;//封鎖開始點
queue<
int>
qx,qy;
//座標佇列
qx.push
(start.x)
; qy.
push
(start.y)
;//開始點進入佇列
while
(!qx.
empty()
)
qx.push
(next.x)
; qy.
push
(next.y);}
}if(next.x == finish.x && next.y == finish.y)
break
;//已到達出口
}//構造路徑
pathlen = g[finish.x]
[finish.y]
; cur = finish;
for(
int i = pathlen-
1; i >=
0; i--)}
cur = next;
//移動到當前位置 }}
intmain()
for(
int i =
1; i < m-
1; i++
)//初始化網格內區域為0
g[5][
1]=-
1; g[6]
[1]=
-1; g[6]
[2]=
-1; g[6]
[3]=
-1; g[7]
[1]=
-1; g[7]
[2]=
-1; g[7]
[3]=
-1; g[1]
[3]=
-1; g[2]
[3]=
-1; g[2]
[4]=
-1; g[3]
[5]=
-1; g[4]
[4]=
-1; g[4]
[5]=
-1; g[5]
[5]=
-1;// 內部設牆
for(
int i =
0; i < m; i++
) cout<
} start.x =
3; start.y =
2; finish.x =
4; finish.y =6;
point *path =
newpoint
[m*m]
;findpath
(g,start,finish,pathlen,path)
;for
(int i =
0; i < m; i++
) cout<
}for
(int i =
0; i < pathlen; i++
)for
(int i =
0; i < m; i++
) cout<
}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或者沒有可到達相鄰方格為止。距離...
C 電路佈線 最短路徑問題
問題描述 用二維陣列表示地圖,若值為 1 則表示有障礙物,若值為 0 則表示可以通行。輸入 m n 的二維陣列,佈線起點座標,佈線終點座標。輸出 最短佈線距離以及對應的佈線路徑。問題分析 從起點開始佈線,將起點標記為 0 把四周可佈線的位置標記為 起點標記值 1 同時將這些點插進佇列 q 插到隊尾 ...