题目描述
- N皇后的排列,每行一个不冲突;N<=13。
输入要求
一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。
输出要求
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
解的输出顺序为从上到下从左到右,小的优先输出
输入样例
6
输出样例
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
#include<iostream>
#include<cstring>
using namespace std;
int q[15]={0};
int sum=0;
int n;
void queen(int i)
{
int j;
int col,flag;
if(i==n+1)//所有的行全部走完,即成功找到一种解法
{//注意是n+1因为只有到n+1才说明前n行都ok
sum++;
if(sum<=3)
{
for(j=1;j<=n;j++)
{ if(j==n)
cout<<q[j]<<endl;
else
cout<<q[j]<<" ";}
}
return ;
}
else
{
for(col=1;col<=n;col++)//遍历i行的每一列
{
flag=1;
for(j=1;j<i;j++)//n遍历前i行是否符合
{ if(col==q[j]||i-col==j-q[j]||i+col==j+q[j])
{ //在主对角线中,其行与列的差相同即i-col==j-q[j]
//在副对角线中,其行与列的和相同即i+col==j+q[j]
flag=0;
break;
}
}
if(flag==1)
{
q[i]=col;
queen(i+1);
}
}
}
}
int main(void)
{
cin>>n;
memset(q,15,sizeof(q));//皇后所在的位置就是其col,所以初始值要大于列
queen(1);
cout<<sum<<endl;
return 0;
}