設計一個解n後問題的優先佇列式分支限界法
using namespace std;
struct HeapNode{ //定義一個結構體用來儲存節點的行和列
int row;//行
int col;//列
};
struct cmp{ //自定義比較函式,在優先佇列中將會用到,優先順序的設定
bool operator()(HeapNode a,HeapNode b) {
if(a.row==b.row)return a.col>b.col;//同一行的列號越小優先順序越高
else return a.row<b.row;//不同行行號行號越大優先順序越高
}
};
struct cmp { //自定義比較函式,在優先佇列中將會用到,優先順序的設定
bool operator()(HeapNode a, HeapNode b) {
if (a.row == b.row)return a.col < b.col;//同一行的列號越小優先順序越高
else
{
if (a.row == b.row)return a.col < b.col;
else return a.row < b.row;//不同行行號行號越大優先順序越高
}
}
};
//priority_queue為優先佇列類模板,根據優先順序(cmp)進行排列
void AddLiveNode(priority_queue<HeapNode,vector<HeapNode>,cmp> &maximum_heap,int i,int n){
HeapNode node;
for (int j = 1; j <= n; j++){
node.row=i;
node.col=j;
maximum_heap.push(node);
}
}
bool place(int k,int *track){
for (int j = 1; j < k; j++){
if ((abs(k - j) == abs(track[j]- track[k]) || (track[j]==track[k])))//前面的是檢查是否在同一對角線上後面是是否在同一列上
return false;
}
return true;
}
bool nqueens(priority_queue<HeapNode,vector<HeapNode>,cmp> &maximum_heap,int n,int *track){ //放置節點的過程
AddLiveNode(maximum_heap,1,n);
int i=0;
do
{
i=maximum_heap.top().row;
/*防止超過界限賦值,以避免指標越界。*/
if(i !=n+1)
track[i]=maximum_heap.top().col;//取隊首元素
maximum_heap.pop();//隊首元素出隊
/*防止超過界限,以避免指標越界。*/
if(i !=n+1)
{
if(place(i,track))
AddLiveNode(maximum_heap,i+1,n);
}
if(maximum_heap.empty()) return false;
}while(i !=n+1);
while(!maximum_heap.empty())
maximum_heap.pop();
return true;
}