AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 更多
    • 题解
    • 分享
    • 问答
    • 应用
  • App
  • 教育优惠
    New
  • 登录/注册

AcWing 843. n-皇后问题    原题链接    中等

作者: 作者的头像   DamianHuang ,  2023-11-21 13:42:03 ,  所有人可见 ,  阅读 19


0


dfs又一经典例题,用全排列的思路解决

import java.util.*;

public class Main {
    static int n;
    static int N = 10;
    static boolean[] col = new boolean[N]; // 每一列
    static boolean[] dg = new boolean[N * 2]; // 对角线、反对角线个数会多一些
    static boolean[] udg = new boolean[N * 2]; // 反对角线
    static char[][] g = new char[N][N]; // 存储棋盘

    private static void dfs(int u) { // 以全排列的思路想n皇后问题
        if (u == n) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) System.out.print(g[i][j]);
                System.out.println();
            }
            System.out.println();
        } else {
            for (int i = 0; i < n; i++) {
                if (!col[i] && !dg[u + i] && !udg[n - u + i - 1]) { // 只有在该列、对角线、斜对角线都没有皇后时,才放上去
                    g[u][i] = 'Q';
                    col[i] = true;
                    dg[u + i] = true;
                    udg[n - u + i - 1] = true;
                    dfs(u + 1);
                    // 恢复现场
                    col[i] = false;
                    dg[u + i] = false;
                    udg[n - u + i - 1] = false;
                    g[u][i] = '.';
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();

        for (int i = 0; i < n; i++) 
            for (int j = 0; j < n; j++)
                g[i][j] = '.';

        dfs(0);
    }
}

0 评论

你确定删除吗?

© 2018-2023 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息