题目描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
输入
一个整数n( 1 < = n < = 10 )
输出
每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”
样例输入
4
样例输出
2 4 1 3
3 1 4 2
思路:回溯法优化。
#include <cstdio>
#include <cmath>
const int maxn = 11;
// n皇后问题,P为当前排列,hash记录整数x是否已经在P中,cnt记录合法排列个数
int n, P[maxn], hash[maxn] = {false}, cnt = 0;
void FullP(int index) { //当前处理排列的第index号位
if (index == n + 1) { //递归边界,能到达这里的一定是合法的
for (int i = 1; i < n; i++) {
printf("%d ", P[i]);
}
printf("%d\n", P[n]);
cnt++;
return;
}
for (int x = 1; x <= n; x++) {
if (hash[x] == false) {
bool flag = true;
for (int pre = 1; pre < index; pre++) { //遍历之前的皇后
//第index列皇后的行号为x,第pre列皇后的行号为P[pre]
if (abs(index - pre) == abs(x - P[pre])) {
flag = false;
break;
}
}
if (flag) {
P[index] = x;
hash[x] = true;
FullP(index + 1); //递归式
hash[x] = false;
}
}
}
}
int main() {
scanf("%d", &n);
FullP(1); //从P[1]开始填
if (cnt == 0) printf("no solute!");
return 0;
}