Description
N皇后的排列,每行一个不冲突;N<=13。
Input
一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。
Output
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
解的输出顺序为从上到下从左到右,小的优先输出
Sample Input
6
Sample Output
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[20]; // 每个皇后所在的列数
int solves = 0; //解法
void queen(int i, int n)
{
if(i == n+1){ // 所有行全部走完,成功找到一种解法
solves++;
if(solves <= 3){ // 只输出前三个解
for(int j=1; j<=n; j++){
if(j == n){ // 格式控制,保证输出每行结尾处没有空格
cout << q[j];
cout << endl;
}
else
cout << q[j] << " ";
}
}
return ;
}
else
for(int col=1; col<=n; col++){ // 遍历第i行的每一列,找到可以放置皇后的位置
bool flag = true;
for(int j=1; j<i; j++){ // 遍历前i行,判断列col是否冲突
if(col==q[j] || i+col==j+q[j] || i-col==j-q[j]){
flag = false;
break;
}
}
if(flag){
q[i] = col;
queen(i+1, n);
}
}
}
int main()
{
int n;
memset(q,20,sizeof(q));
cin >> n;
queen(1, n);
cout << solves << endl;
return 0;
}