设计一个解n后问题的优先队列式分支限界法

本文介绍了一种使用优先队列解决N皇后问题的方法。通过自定义比较函数来确定节点的优先级,利用优先队列实现对活节点的选择,确保每次选择的都是当前最优节点。该方法不仅展示了如何定义比较函数,还详细说明了如何通过优先队列来寻找解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

}

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值