#include <bits/stdc++.h>
using namespace std;
struct NQueens{
int n;
vector<vector<int>>ans;
NQueens(int n):n(n){}
bool ok(int x,int y,vector<int>&hv){ // 第x行y列是否可以放置
// (x, y) 和 (i + 1,hv[i])
for(int i = 0; i < hv.size(); i++) {
if(abs(x - (i + 1)) == abs(y - hv[i]) || hv[i] == y)return false;
}
return true;
}
void work(){
queue<vector<int>>q;
q.push({}); // 第一行, 放置0
int sz = 1;
for(int i = 1; i <= n; i++){ // 行
int tmp = 0;
while(sz--){ // 按层处理
vector<int> hv = q.front();q.pop();
for(int j = 1; j <= n; j++){ // 列
if(ok(i, j, hv)){
hv.push_back(j);
q.push(hv);
tmp++; // 下一层数量+1
hv.pop_back();
}
}
}
sz = tmp;
}
while(sz --){
vector<int>res = q.front();q.pop();
ans.push_back(res);
}
}
vector<int> get(){
return ans[0];
}
vector<vector<int>>getall(){
return ans;
}
};
int main(){
int n;
cin >> n;
NQueens nq(n);
nq.work();
// vector<int> ans = nq.get();
vector<vector<int>>all = nq.getall();
if(all.size() == 0){
cout <<"无解" << endl;
}
else{
for(auto ans:all){
for(auto j:ans){
cout << j <<' ';
}
cout <<endl;
}
}
return 0;
}
N皇后问题-分支限界法-c++代码
最新推荐文章于 2024-08-21 18:16:36 发布