• acwing 843. n-皇后问题


    n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

    在这里插入图片描述

    现在给定整数 n,请你输出所有的满足条件的棋子摆法。

    输入格式
    共一行,包含整数 n。

    输出格式
    每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。

    其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

    每个方案输出完成后,输出一个空行。

    注意:行末不能有多余空格。

    输出方案的顺序任意,只要不重复且没有遗漏即可。

    数据范围
    1≤n≤9
    输入样例:
    4
    输出样例:
    .Q…
    …Q
    Q…
    …Q.

    …Q.
    Q…
    …Q
    .Q…

    这题也是DFS, 可以根据全排列的

    解法1:按行枚举 (也是跟上一题 全排列类似的)
    可以作为模版进行记忆

    在这里插入图片描述

    #include <iostream>
    using namespace std;
    const int N = 20; 
    
    // bool数组用来判断搜索的下一个位置是否可行
    // col列,dg对角线,udg反对角线
    // g[N][N]用来存路径
    
    int n;
    char g[N][N];
    bool col[N], dg[N], udg[N];
    
    void dfs(int u) {
        // u == n 表示已经搜了n行,故输出这条路径
        if (u == n) {
            for (int i = 0; i < n; i ++ ) puts(g[i]);   // 等价于cout << g[i] << endl;
            puts("");  // 换行
            return;
        }
        
    	// 枚举u这一行,搜索合法的列, // 这里可将行看成y, 列看成x
        // 这里是枚举第u行, 第i 列, 是否放皇后, u= y, i = x 后 ===》 对角线就是 u + i、u - i + n
    	for (int i = 0; i < n; i ++ )
    		// 剪枝(对于不满足要求的点,不再继续往下搜索)  
            if (!col[i] && !dg[u + i] && !udg[n - i + u])
            {
                g[u][i] = 'Q';
                col[i] = dg[u + i] = udg[n - i + u] = true;
                dfs(u + 1);
                col[i] = dg[u + i] = udg[n - i + u] = false;
                g[u][i] = '.';   // 恢复现场
            }
    }
    
    int main() {
        cin >> n;
        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < n; j ++ )
                g[i][j] = '.';
    
        dfs(0);
    
        return 0;
    }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    方法2: 按照每个元素进行枚举
    每个位置都有2种情况,放还是不放,总共就有n2

    时间复杂度: O(2的n2次方), 打不出来了,见谅

    原理图: 就类似这样画下去
    在这里插入图片描述

    思路: 按照每个位置放不放的步骤一点一点进行搜索。

    code:

    // 不同搜索顺序 时间复杂度不同  所以搜索顺序很重要!
    #include <iostream>
    using namespace std;
    const int N = 20;
    
    int n;
    char g[N][N];
    bool row[N], col[N], dg[N], udg[N]; // 因为是一个个搜索,所以加了row
    
    // s表示已经放上去的皇后个数
    void dfs(int x, int y, int s)
    {
        // 处理超出边界的情况, 这个是直接一行进行放还是不放, 一行走完了,跳到下一行开始
        if (y == n) y = 0, x ++ ;  
    
        if (x == n) { // x==n说明已经枚举完n^2个位置了
            if (s == n) { // s==n说明成功放上去了n个皇后
                for (int i = 0; i < n; i ++ ) puts(g[i]);
                puts("");
            }
            return;
        }
    
        // 分支1:放皇后
        if (!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n]) {
            g[x][y] = 'Q';
            row[x] = col[y] = dg[x + y] = udg[x - y + n] = true;
            dfs(x, y + 1, s + 1);
            row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;
            g[x][y] = '.';
        }
    
        // 分支2:不放皇后
        dfs(x, y + 1, s);
    }
    
    
    int main() {
        cin >> n;
        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < n; j ++ )
                g[i][j] = '.';
    
        dfs(0, 0, 0);
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    汽车 CAN\CANFD数据记录仪
    游戏引擎用什么语言开发上层应用
    Windows安装配置Rust(附CLion配置与运行)
    [centos]centos7源码编译cmake报错Could NOT find OpenSSL
    设计模式-工厂设计模式
    深信服AC流量管理技术
    Redis持久化之AOF
    Java核心编程学习 -- day9
    【C++】继承 ⑬ ( 虚继承原理 | 虚继承解决继承二义性问题 | 二义性产生的原因分析 )
    导入Embassy库进行爬虫
  • 原文地址:https://blog.csdn.net/qq_39486027/article/details/125624336