布線問題:印刷電路板將布線區(qū)域劃分成n×m個(gè)方格陣列,要求確定連接方格陣列中的方格a的中點(diǎn)到方格b的中點(diǎn)的最短布線方案。在布線時(shí),電路只能沿直線或直角布線,為了避免線路相交,已布了線的方格做了封鎖標(biāo)記,其他線路不允許穿過被封鎖的方格。如下圖所示:
布線問題的解空間是一個(gè)圖,則從起始位置a開始將它作為第一個(gè)擴(kuò)展結(jié)點(diǎn)。與該擴(kuò)展結(jié)點(diǎn)相鄰并可達(dá)的方格成為可行結(jié)點(diǎn)被加入到活結(jié)點(diǎn)隊(duì)列中,并且將這些方格標(biāo)記為1,即從起始方格a到這些方格的距離為1。接著,從活結(jié)點(diǎn)隊(duì)列中取出隊(duì)首結(jié)點(diǎn)作為下一個(gè)擴(kuò)展結(jié)點(diǎn),并將與當(dāng)前擴(kuò)展結(jié)點(diǎn)相鄰且未標(biāo)記過的方格標(biāo)記為2,并存入活結(jié)點(diǎn)隊(duì)列。這個(gè)過程一直繼續(xù)到算法搜索到目標(biāo)方格b或活結(jié)點(diǎn)隊(duì)列為空時(shí)為止。
它的2個(gè)成員row和col分別表示方格所在的行和列。在方格處,布線可沿右、下、左、上4個(gè)方向進(jìn)行。沿這4個(gè)方向的移動(dòng)分別記為0,1,2,3。下表中,offset[i].row和offset[i].col(i= 0,1,2,3)分別給出沿這4個(gè)方向前進(jìn)1步相對(duì)于當(dāng)前方格的相對(duì)位移。
#include <stdio.h>
typedef struct {
int row;
int col;
}Position;
int FindPath (Position start, Position finish, int &PathLen, Position *&path)
{ //計(jì)算從起始位置start到目標(biāo)位置finish的最短布線路徑,找到返回1,否則,返回0
int i;
if ((start.row = = finish.row) && (start.col = = finish.col)) {
PathLen = 0; return 0; } //start = finish
//設(shè)置方格陣列”圍墻”
for (i = 0; i <= m+1; i++)
grid[0][i] = grid[n+1][i] = 1; //頂部和底部
for (i = 0; i <= n+1; i++)
grid[i][0] = grid[i][m+1] = 1; //左翼和右翼
//初始化相對(duì)位移
int NumOfNbrs = 4; //相鄰方格數(shù)
Position offset[4], here, nbr;
offset[0].row = 0; offset[0].col = 1; //右
offset[0].row = 1; offset[0].col = 0; //下
offset[0].row = 0; offset[0].col = -1; //左
offset[0].row = -1; offset[0].row = 0; //上
here.row = start.row;
here.col = start.col;
LinkedQueue <Position> Q; //標(biāo)記可達(dá)方格位置
do {
for (i = 0; i< NumOfNbrs; i++) { //標(biāo)記可達(dá)相鄰方格
nbr.row = here.row + offset[i].row ;
nbr.col = here.col + offset[i].col;
if (grid[nbr.row][nbr.col] = = 0) { //該方格未標(biāo)記
grid[nbr.row][nbr.col] = grid[here.row][here.col] + 1;
if ((nbr.row = = finish.row) && (nbr.col = = finish.col)) break;//完成布線
Q.Add(nbr);
}
}
if ((nbr.row = = finishi.row) && (nbr.col = = finish.col)) break;//完成布線
if (Q.IsEmpty()) //活隊(duì)列是否為空
return 0; //無解
Q.delete(here); //取下一個(gè)擴(kuò)展結(jié)點(diǎn)
}while (1);
//構(gòu)造最短布線路徑
PathLen = grid[finish.row][finish.col] - 2;
path = new Position[PathLen];
here = finish;
for (int j = PathLen
主站蜘蛛池模板:
91大神在线看
|
精品一区二区三区三区
|
综合一区二区三区
|
国产aⅴ一区二区
|
91在线 | 亚洲
|
可以免费观看的av
|
午夜精品在线观看
|
国产精品99久久久久久久久久久久
|
日韩中文一区
|
欧美日韩在线第一页
|
2018国产大陆天天弄
|
日韩成人精品视频
|
欧美日韩在线观看一区
|
经典三级在线播放
|
亚洲精品乱码久久久久久
|
久久精品网
|
久久久久免费观看
|
中文字幕精品一区二区三区精品
|
国产精品欧美一区二区三区
|
亚洲精品在线免费观看视频
|
久久亚洲美女视频
|
欧美电影一区
|
欧美一区二区二区
|
久久久久国产精品
|
国产视频第一页
|
美女黄网
|
91久久人人夜色一区二区
|
一区二区在线免费观看
|
高清精品一区二区
|
西西做爰免费视频
|
超碰在线观看免费版
|
亚洲欧美日韩国产
|
日韩免费视频一区二区
|
久久国产精品久久
|
日本中文字幕一区
|
日韩中文一区二区
|
欧美在线一区二区三区
|
久久视频一区
|
日韩中文字幕一区二区
|
久久久久亚洲
|
三区在线
|