39.Acwing基础课第843题-中等-n-皇后问题

39.Acwing基础课第843题-中等-n-皇后问题

题目描述

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

1_597ec77c49-8-queens.png

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

输入格式

共一行,包含整数 n。

输出格式

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

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

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

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

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

数据范围

1≤n≤9

输入样例:

4

输出样例:

.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..

代码:

#include <iostream>
using namespace std;

const int N = 20;       // 定义最大棋盘大小,足够题目使用

bool col[N];             // col[i]   = 第 i 列是否已经放了皇后
bool dg[2 * N];          // dg[]     = 正对角线(左上→右下 /)是否被占用
bool udg[2 * N];         // udg[]    = 反对角线(右上→左下 \)是否被占用

int n;                   // 输入的棋盘大小 n x n
char g[N][N];            // 存储棋盘,g[i][j] 表示第i行第j列


// u 表示当前正在处理第 u 行
void dfs(int u)
{
    // 递归终止条件:已经处理完所有 n 行,说明找到一个合法方案
    if(n == u)
    {
        // 输出当前棋盘方案
        for(int i = 0; i < n; i++)  
            puts(g[i]);   // puts 输出一行,自动换行
        puts("");        // 每个方案后输出一个空行,符合题目格式
        return;
    }
    
    // 枚举当前第 u 行的每一列 i,尝试放皇后
    for(int i = 0; i < n; i++)
    {
        // 剪枝核心:
        // 1. col[i]        → 第 i 列没皇后
        // 2. dg[u - i + n] → 正对角线没皇后(+n 防止下标为负数)
        // 3. udg[u + i]    → 反对角线没皇后
        // 三个条件都满足,才能放皇后
        if(!col[i] && !dg[u - i + n] && !udg[u + i])
        {
            g[u][i] = 'Q';                      // 在当前位置放皇后
            
            // 标记:这一列、两条对角线都被占用了
            col[i] = dg[u - i + n] = udg[u + i] = true;
            
            dfs(u + 1);                         // 递归到下一行
            
            // 回溯:撤销标记,恢复状态,尝试下一个位置
            col[i] = dg[u - i + n] = udg[u + i] = false;
            g[u][i] = '.';                      // 把皇后改回点
        }
    }
}

int main()
{
    cin >> n;                      // 输入 n
    
    // 初始化棋盘:所有位置都是 .
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            g[i][j] = '.';

    dfs(0);             // 从第 0 行开始搜索
    return 0;
}
posted @ 2026-04-07 10:13  CodeMagicianT  阅读(1)  评论(0)    收藏  举报