#### N皇后
题目ID:8016必做题100分
最新提交:
Wrong Answer
36 分
历史最高:
Wrong Answer
36 分
> 时间限制: 1000ms
>
>
>
> 空间限制: 32000kB
### 题目描述
#### **时间限制:1s 空间限制:32M**
#### **题目描述:**
检查一个如下的6∗66∗6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列246135246135来描述,第�i个数字表示在第�i行的相应位置有一个棋子,如下:
行号 123456123456
列号 246135246135
这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前33个解。最后一行是解的总个数。
#### **输入格式:**
一个数字�N 表示棋盘是 �∗�N∗N 大小的,要放�N个皇后。(6≤ �≤ 13)(6≤ n≤ 13)
#### **输出格式:**
前三行为前三个解,每个解的两个数字之间用一个空格隔开。
第四行只有一个数字,表示解的总数。
#### **样例输入1:**
6
#### **样例输出1:**
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
#include<bits/stdc++.h>
using namespace std;
struct c{
int bh, sx;
bool zt;
}vc[14] = {c{0, 0, false}};
int n, cnt = 0;
bool vx[36] = {false}, vy[36] = {false};
bool cmp(c a, c b){
return a.bh < b.bh;
}
void dfs(int x){
if (x > n){
sort(vc + 1, vc + 1 + n, cmp);
cnt++;
if (cnt <= 3){
for (int i = 1;i <= n;i++){
cout << vc[i].sx << ' ';
}
cout << endl;
}
}
else{
for (int i = 1;i <= n;i++){
if (!(vc[i].zt || vx[n-x+i] || vy[x+i-1])){
vc[i].zt = true;
vc[i].bh = x;
vc[i].sx = i;
vx[n-x+i] = true;
vy[x+i-1] = true;
dfs(x + 1);
vc[i].zt = false;
vx[n-x+i] = false;
vy[x+i-1] = false;
}
}
}
}
int main(){
cin >> n;
dfs(1);
cout << cnt;
return 0;
}