佈線問題就是在 m×n 的方格陣列中,指定乙個起點 a、乙個終點 b,要求找到起點到終點的最短佈線方案(最短路徑)。
搜尋從起點 a 開始,到目標點 b 結束。約束條件:有邊相連且未成佈線。
搜過過程:從起點 a 開始,將其作為乙個擴充套件結點,沿 a 的上、下、左、右 4 個方向的相鄰結點擴充套件。判斷約束條件是否成立,如果成立,則放入活結點表中,並將這些方格標記為 1。接著從活結點表中取出隊首結點作為下乙個當前擴充套件節點,將其相鄰且未標記的方格記為2。依此類推,一直繼續到演算法搜尋到目標方格或活結點表為空為止。目標方格裡的資料表示的就是佈線長度,即最短路徑。路徑可以反向根據數字從 b 遞減到 a 。
過程如下動畫:
for(int i=0; i <= n+1; i++)//方格陣列上下圍牆
grid[0][i] = grid[m+1][i] = -2;
for(int i=0; i <= m+1; i++)//方格陣列左右圍牆
grid[i][0] = grid[i][n+1] = -2;
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;
int numofnbrs = 4;
position here, nbr;
here.row = start.row;
here.col = start.col;
grid[start.row][start.col] = 0;
queueq;
do if((nbr.row==finish.row) && (nbr.col==finish.col))
break;
}if((nbr.row==finish.row) && (nbr.col==finish.col))
break;//完成佈線
if(q.empty())
return false;
here = q.front();
q.pop();
} while(true);
pathlen = grid[finish.row][finish.col];
path = new position[pathlen];
here = finish;
for(int j=pathlen-1; j >= 0; j--)
here = nbr;
}return true;
}int main()
if(i == start.row && j == start.col)
}if(r == pathlen)
cout << "= ";}}
cout << endl;
}return 0;
}
佈線問題 分支限界法
問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 精確的電路佈線問題要求確定連線方格a的中點,到連線方格b的中點的最短佈線方案。佈線時,電路只能沿直線或直角佈線。為了避免線路相交,已佈的線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。分支限界法的解決方案 首先,從起始位置a開始,...
佈線問題 分支限界法
問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 精確的電路佈線問題要求確定連線方格a的中點,到連線方格b的中點的最短佈線方案。佈線時,電路只能沿直線或直角佈線。為了避免線路相交,已佈的線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。分支限界法的解決方案 首先,從起始位置a開始,...
佈線問題 分支限界法c 實現
問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 分支限界法類似於回溯法,也是在問題的解空間上搜尋問題的解的演算法。分支限界法是找出滿足約束條件的乙個解或者滿足某種條件的最優解。分支限界法則以廣度優先或者最小耗費優先的方式搜尋解空間。其搜尋策略是 1 在擴充套件結點處,先生成其所有的兒...