八皇后问题(递归)

二、思路

  设置两个int型数组p[]和hashTable[],分别记录已放置皇后列的行,和当前行是否被皇后占用。使用递归遍历列,判断当前列是否有皇后,如果没有则判断当前对角线是否有皇后。如果两项条件都符合则将皇后放置在此处然后继续遍历下一列。

二、代码

#include<cstdio>
#include<cmath>
#include<stdio.h>
using namespace std;
const int maxn = 11;
int count = 0;
//P[maxn]记录之前皇后所在列的行号,hashTable[maxn]记录当前排中是否有皇后
int n=0, p[maxn], hashTable[maxn] = { false };
//index为当前行的列
void bianli(int index) {
    //全部摆满了,方法数加一,递归结束
    if (index == n + 1) {
        count++;
        return;
    }
    for (int i = 1; i <= n; i++) {
        //第i行没有皇后
        if (hashTable[i] == false) {
            bool flag = true;
            //遍历之前的对角线上是否有皇后
            for (int k = 1; k < index; k++) {
                //之前对角线上的皇后列号为k,行号为p[k],当前排为i,当前列为index,行减行,列减列
                if (abs(k-index)==abs(p[k]-i))
                {
                    flag = false;
                    break;
                }
            }
            //当前行列及对角线都没有皇后,flag为true
            if (flag) {
                //放置当前列的皇后
                p[index] = i;
                //这一行已被占用
                hashTable[i] = true;
                //递归处理下一行
                bianli(index + 1);
                //递归结束,还原第i行的占用状态
                hashTable[i] = false;
            }
        }
    }
}

int main() {
    scanf_s("%d",&n);
    bianli(1);
    printf("%d", count);
}
View Code

 

posted @ 2022-03-01 21:23  Protect_Winter  阅读(34)  评论(0)    收藏  举报