题解 | #N皇后问题#
N皇后问题
https://ac.nowcoder.com/acm/problem/235813
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int cnt=0,n
**b代表竖直方向的某一列是否被标记,lf和rg是left和right的简写,分别表示左斜方向和右
斜方向是否有皇后标记了
int b[N],lf[N*N],rg[N*N];
void dfs(int num)**num=1代表遍历第一行,num=3代表遍历第三行,num代表当num>n也就是
遍历完n行之后,就结束遍历了**
{
if(num>n){
cnt++;
return ;
}
for(int j=1;j<=n;j++)
{//这也就是刚才说的,在num行上,遍历竖直方向,左斜方向,右斜方向是否存在皇后
if(b[j]==0&&lf[j+num+50]==0&&rg[j-num+50]==0)
{//如果没有存在,就标记,表示有皇后了
b[j]=1;lf[j+num+50]=1;rg[j-num+50]=1;
dfs(num+1);
b[j]=0;lf[j+num+50]=0;rg[j-num+50]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<cnt;
}