N皇后问题
N皇后问题是指在一个N*N的国际象棋棋盘上放置N个皇后,使得这N个皇后两两均不在同一行、同一列、同一条对角线上,求合法的方案数。考虑每行每列只能放一个皇后,那么如果把n列皇后所在行号依次写出,那么就会是一个1~n的排列.只需查看排列是否合法即可.
#include <cstdio>
#include <cstdlib>
#include <cmath>
int n, hashTable[100010], countt, P[100010];
void generateP(int index) {
if (index == n + 1) {
countt++;
for (int i = 1; i < n; ++i)
printf("%d", P[i]);
printf("%d\n");
return;
}
for (int i = 1; i <= n; ++i) {
if (hashTable[i] == false) {
bool flag = true;
for (int pre = 1; pre < index; ++pre) {
if (abs(index - pre) == abs(i - P[pre])) {
flag = false;
break;
}
}
if (flag) {
P[index] = i;
hashTable[i] = true;
generateP(index + 1);
hashTable[i] = false;
}
}
}
}
int main() {
scanf("%d", &n);
generateP(1);
printf("%d\n", countt);
return 0;
}