1. 程式人生 > >設計一個解n後問題的優先佇列式分支限界法

設計一個解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;

}