家人们看图吧 选错编辑器了
include<bits/stdc++.h>
using namespace std;
int n;
int lie[15];//判断列
int zuo[30];//开的至少得是2n+1个(至少有2n+1个斜线 具体看下文),可多开几个不必精确计算
int you[30];
//zuo:x-y+n you:x+y 即左倾斜\ 同一斜线上坐标x-y定值 右倾斜/ 同一斜线上坐标x+y 为定值
//因此一个一维数组既包括了一条斜线
//x-y最小为-n x+y最小为0 不管加几只是为了避免数组下标为负数的情况 加的数大数组开大点即可
int ans;
void dfs(int dep)//dep 代表行即x
{
if(dep>n){
ans++;
return ;
}
for(int i=1;i<=n;i++)//i其实代表列即y 包括了从第一行第一列为皇后至第n列为皇后开始的所有情况 { if(lie[i]==0&&zuo[dep-i+n]==0&&you[dep+i]==0) { lie[i]=1; zuo[dep-i+n]=1; you[dep+i]=1; dfs(dep+1); lie[i]=0; zuo[dep-i+n]=0; you[dep+i]=0; } }
}
int main() { cin>>n; dfs(1); cout<<ans; }