AcWing 843. n-皇后问题
原题链接
中等
作者:
满目星河_0
,
2021-03-31 12:32:02
,
所有人可见
,
阅读 155
带注释(超详细)
//算法思想:与全排列的思想类似,只不过多加了几个判断条件。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=10;
bool col[N],ue[2*N],un[2*N];
//ue表示主对角线上面的是否有数,un表示副对角线上是否有数。
//主对角线和副对角线的数量都是2*n-1,所以初始化大小为2N
char str[N][N];
int n;
void dfs(int u){
if(u>n){//递归出口
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<str[i][j];
}
cout<<endl;
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
//这里的i+u表示x+y;i-u+n表示y-x+n(加上n是为了防止出现负数,数组溢出)
//对角线满足这个规律,主对角线可以用x+y表示每一条主对角线,副对角线可以用x-y+n来表示
//每一条副对角线。
if(!col[i] && !ue[i+u] && !un[i-u+n]){
//当满足这三个条件时,可以向当前这个格子放皇后
str[u][i]='Q';
col[i]=ue[i+u]=un[i-u+n]=true;
dfs(u+1);
//恢复现场
str[u][i]='.';
col[i]=ue[i+u]=un[i-u+n]=false;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
str[i][j]='.';
}
}
dfs(1);
return 0;
}