• 八皇后问题(递归)


    二、思路

      设置两个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
  • 相关阅读:
    Errors
    fix eclipse gc overhead limit exceeded in mac
    Cobub Razor
    Mac commands
    git vs svn
    SourceTree
    生成静态页技术
    URL重写技术总结
    回味手写三层-增删改查
    生成 (web): 找不到目标 .NET Framework 版本的引用程序集;请确保已安装这些程序集或选择有效的目标版本。
  • 原文地址:https://www.cnblogs.com/wangzhaojun1670/p/15952685.html
Copyright © 2020-2023  润新知