分支限界法求解迷宮問題
定義乙個二維陣列,例如:
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開始,...