迷宮問題 分支限界法

2021-10-06 20:18:30 字數 1724 閱讀 4341

分支限界法求解迷宮問題

定義乙個二維陣列,例如:

int maze[5][5] =

;它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。

乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一最短路徑。

左上角到右下角的最短路徑,格式如樣例所示。

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

(0,0)

(1,0)

(2,0)

(2,1)

(2,2)

(2,3)

(2,4)

(3,4)

(4,4)

#include

#include

using

namespace std;

int ans[25]

;int minnum=25;

//到達終點時點的個數

struct dot

;//出隊函式

void

pop(queue

* q)

;//入隊函式

void

push

(queue

* q, dot d)

;void

getans

(queue

* q, dot d,

int pos)

;int

main()

queue

* q=

new queue[25

];// q-

>

push

(d[0])

;//起點入隊

getans

(q, d,0)

;for

(int i =

0; i < minnum; i++

)delete

q;return0;

}void

pop(queue

* q)

void

push

(queue

* q, dot d)

void

getans

(queue

* q, dot d,

int pos)

minnum = d[pos]

.count;

}else

return;}

pop(q)

;//當前起點出隊

if(d[pos]

.count > minnum)

//優先順序:右、下、上、左 通過if限界

if(pos %5!=

4&& d[pos +1]

.num !=1)

d[pos +1]

.temp[d[pos +1]

.count-1]

= pos +1;

getans

(q, d, pos +1)

;}if(pos /5!=

4&& d[pos +5]

.num !=1)

if(pos /5!=

0&& d[pos -5]

.num !=1)

if(pos %5!=

0&& d[pos -1]

.num !=1)

}

分支限界法求解迷宮問題

分支限界法類似與回溯法,也是一種在問題的解空間樹上搜尋問題的解法。但後者的目標是找到滿足約束條件的所有解,而前者要求找到某種意義下的最優解 極大值 極小值 分支限界法採用廣度優先的策略,依次搜尋活結點的所有分支,也就是所有相鄰結點。設計合適的限界函式,排除該活結點不可能產生最優解的孩子結點,來提高搜...

佈線問題 分支限界法

佈線問題就是在 m n 的方格陣列中,指定乙個起點 a 乙個終點 b,要求找到起點到終點的最短佈線方案 最短路徑 搜尋從起點 a 開始,到目標點 b 結束。約束條件 有邊相連且未成佈線。搜過過程 從起點 a 開始,將其作為乙個擴充套件結點,沿 a 的上 下 左 右 4 個方向的相鄰結點擴充套件。判斷...

佈線問題 分支限界法

問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 精確的電路佈線問題要求確定連線方格a的中點,到連線方格b的中點的最短佈線方案。佈線時,電路只能沿直線或直角佈線。為了避免線路相交,已佈的線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。分支限界法的解決方案 首先,從起始位置a開始,...