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;
            }
        }
    }
}

 

posted @ 2020-07-03 23:22  cicinnus  阅读(296)  评论(0编辑  收藏  举报