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

被折叠的 条评论
为什么被折叠?



