问题 D: 八皇后
题目链接:http://codeup.cn/problem.php?cid=100000583&pid=3
思路
- 从第一行开始,一行一行做下去
- 设置计数cnt,当cnt满足题目条件b时,输出
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int cnt; // 与b对应,计数
int p[10]; // 从下标1开始到8,每个元素保存的是每一行的列号,i行p[i]列
bool used[10]; // used[i]表示第i列的格子使用过
int b;
// 1开始
void generateP(int index) { // index 是行
if (index==8+1) {
cnt++;
if (cnt==b) {
for (int i = 1; i <= 8; i++) {
printf("%d",p[i]);
}
}
return;
}
for (int x = 1; x <= 8; x++) { // 第x列
if (used[x]==false) { // 第x列没有皇后
bool tag = true; // true表示当前皇后不会和之前皇后冲突
for ( int pre = 1; pre < index; pre++) { // 遍历index列之前的皇后, pre是列
if (abs(index-pre)==abs(x-p[pre])) { // 行差==列差
tag = false;
break;
}
}
if (tag) {
p[index] = x;
used[x] = true;
generateP(index+1);
used[x] = false;
}
}
}
}
int main() {
int n;
scanf("%d",&n);
while (n--) {
scanf("%d",&b);
memset(p,0,sizeof(p));
memset(used,0,sizeof(used));
cnt = 0;
generateP(1); // 从第1行开始
printf("\n");
}
return 0;
}