参考题解与n皇后问题——关于斜线的编号https://blog.csdn.net/qq_16964363/article/details/79139889
//
// main.cpp
// shuati
//
// Created by 布屿 on 2019/4/5.
// Copyright © 2019 布屿. All rights reserved.
//
#include<iostream>
using namespace std;
int row[100];//标记行是否被占,0没有被占,1被占
int column[100];//标记列是否被占
int diagonal_1[100];//标记左上到右下的对角线是否被占。(x-y+n)当做数组下标,编号从1~(2*n-1)。
int diagonal_2[100];//标记右上到左下的对角线是否被占。用(x+y-1)当做数组下标。
int sum;//记录解的总数
int n;//n*n的棋盘
void print()
{
if(sum<=2)//只走三次,保证指只输出前三个解
{
for(int i=1;i<=n-1;i++)
{
cout<<row[i]<<" ";
}
cout<<row[n];
cout<<endl;
}
sum++;
}
void search(int row_)
{
if(row_>n)
{
print();
return;
}
else
{
for(int i=1;i<=n;i++)//i是列数
{
if((!column[i])&&(!diagonal_1[row_-i+n])&&(!diagonal_2[row_+i]))
{
row[row_]=i;
column[i]=1;
diagonal_1[row_-i+n]=1;
diagonal_2[row_+i]=1;
search(row_+1);//进一步搜索,下一个皇后
column[i]=0;
diagonal_1[row_-i+n]=0;
diagonal_2[row_+i]=0;
}
}
}
}
int main()
{
cin>>n;//输入n*n的网格,n在全局中已定义
search(1);//第一个皇后
cout<<sum;
return 0;
}