n皇后问题(全排列+回溯)
问题描述:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
如果把n列皇后所在的行号依次写出,会是1-n的一个排列,因此可以考虑用全排列解题,用回溯法优化。
const int maxn = 8; int n, cnt = 0; int hashTable[maxn] = { false }; int P[maxn]; void generateP(int index) { if (index == n + 1) { cnt++; return; } for (int i = 1; i <= n; i++) { //第i行 if (!hashTable[i]) { //第i行没有皇后 bool flag = true; //当前没有冲突 for (int j = 1; j <= index; j++) { //遍历之前的皇后,判断冲突情况 if (abs(index - j) == abs(i - P[j])) { flag = false; break; } } if (flag) { //没有冲突,在i行放置皇后 P[index] = i; hashTable[i] = true; generateP(index + 1); hashTable[i] = false; } } } }