求解最短路徑之電路佈線

2021-08-21 17:22:10 字數 1324 閱讀 1006

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

距離標記過程結束之後,路徑標記過程開始。從方格b開始首先移動到乙個其編號比b的編號小1的相鄰位置上。重複這個過程直至到達a為止。

為了實現距離標記過程,我們可以使用另外乙個陣列儲存距離,亦可以重用陣列grid。為了節約記憶體我們一般使用陣列重用,但是這樣障礙物會和距離為1的方格混合,所以我們選擇將所有的距離標誌都加2。

bool findpath()

position offset[4];

offset[0].row=0;offset[0].col=1;//右

offset[1].row=1;offset[1].col=0;//下

offset[2].row=0;offset[2].col=-1;//左

offset[3].row=-1;offset[3].col=0;//上

//初始化網路四周的weiqiang

for(int i=0;i<=size+1;i++)

position here=start;

grid[start.row][start.col]=2;

int numofnbrs=4;

//對可達的位置做標記

arrayqueueq;

position nbr;do}

if((nbr.row==finish.row)&&(nbr.col==finish.col))break;

if(q.empty())

return false;

here=q.front();

q.pop();

}while(true);

//構造路徑

pathlength=grid[finish.row][finish.col]-2;

path=new position[pathlength];

//從終點回溯

here=finish;

for(int j=pathlength-1;j>=0;j--)

here=nbr;

}return true;

}

**解析:首先將開始點周圍的0點(即可標記點)加一,然後將周圍已標記點插入到佇列,然後每次從佇列頭提取乙個點並刪除,然後將其周圍的可標記點在其基礎上加1。知道隊列為空或者到達結束點。

然後在結束點開始回溯,每次尋找標記比前乙個位置少一的節點。直到開始點。

尋找電路佈線最短路徑 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...

C 電路佈線 最短路徑問題

問題描述 用二維陣列表示地圖,若值為 1 則表示有障礙物,若值為 0 則表示可以通行。輸入 m n 的二維陣列,佈線起點座標,佈線終點座標。輸出 最短佈線距離以及對應的佈線路徑。問題分析 從起點開始佈線,將起點標記為 0 把四周可佈線的位置標記為 起點標記值 1 同時將這些點插進佇列 q 插到隊尾 ...

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

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