家人们看图吧 选错编辑器了 #altinclude<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; }