a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

算法詳解之分支限界法的具體實(shí)現(xiàn)

2020-01-26 15:36:50
字體:
供稿:網(wǎng)友

首先我們來關(guān)注一個(gè)問題:

問題描述:

布線問題:印刷電路板將布線區(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í)為止。

在實(shí)現(xiàn)上述算法時(shí),

(1) 定義一個(gè)表示電路板上方格位置的類Position。

它的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ì)位移。

(2) 用二維數(shù)組grid表示所給的方格陣列。

初始時(shí),grid[i][j] = 0, 表示該方格允許布線,而grid[i][j] = 1表示該方格被封鎖,不允許布線。

算法圖解:

代碼貼出來:

復(fù)制代碼 代碼如下:

#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久久人人夜色一区二区 | 一区二区在线免费观看 | 高清精品一区二区 | 西西做爰免费视频 | 超碰在线观看免费版 | 亚洲欧美日韩国产 | 日韩免费视频一区二区 | 久久国产精品久久 | 日本中文字幕一区 | 日韩中文一区二区 | 欧美在线一区二区三区 | 久久视频一区 | 日韩中文字幕一区二区 | 久久久久亚洲 | 三区在线 |