问题描述:
在n * n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜 线上的棋子。n后问题等价于在n * n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或 同一列或同一斜线上。
输入
8
输出
92
代码
#include <stdio.h>
#include <math.h>
//n表示输入的个数
int n = 0;
int result = 0;
//表示结果的位置
// i表示行 x[i]的值表示列
int x[100] = {0};
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
//约束条件
int constraint(int t) {
for (int i = 1; i < t; i++) {
if (abs(x[t]-x[i]) == abs(t-i)) {
return 0;
}
}
return 1;
}
//回溯法排列树
void backTrack(int t) {
if (t > n) {
result++;
}
else {
for(int i = t; i <= n; i++) {
swap(&x[t], &x[i]);
if (constraint(t)) {
backTrack(t+1);
}
swap(&x[t], &x[i]);
}
}
}
int main(void) {
scanf("%d", &n);
//给x向量赋初值
for(int i = 1; i <= n; i++) {
x[i] = i;
}
backTrack(1);
printf("%d\n", result);
return 0;
}