首先我們來關注一個問題:
問題描述:
布線問題:印刷電路板將布線區域劃分成n×m個方格陣列,要求確定連接方格陣列中的方格a的中點到方格b的中點的最短布線方案。在布線時,電路只能沿直線或直角布線,為了避免線路相交,已布了線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。如下圖所示:
算法思路:
布線問題的解空間是一個圖,則從起始位置a開始將它作為第一個擴展結點。與該擴展結點相鄰并可達的方格成為可行結點被加入到活結點隊列中,并且將這些方格標記為1,即從起始方格a到這些方格的距離為1。接著,從活結點隊列中取出隊首結點作為下一個擴展結點,并將與當前擴展結點相鄰且未標記過的方格標記為2,并存入活結點隊列。這個過程一直繼續到算法搜索到目標方格b或活結點隊列為空時為止。
在實現上述算法時,
(1) 定義一個表示電路板上方格位置的類Position。
它的2個成員row和col分別表示方格所在的行和列。在方格處,布線可沿右、下、左、上4個方向進行。沿這4個方向的移動分別記為0,1,2,3。下表中,offset[i].row和offset[i].col(i= 0,1,2,3)分別給出沿這4個方向前進1步相對于當前方格的相對位移。
(2) 用二維數組grid表示所給的方格陣列。
初始時,grid[i][j] = 0, 表示該方格允許布線,而grid[i][j] = 1表示該方格被封鎖,不允許布線。
算法圖解:
代碼貼出來: