文章

232

粉丝

165

获赞

377

访问

126.4k

头像
N皇后问题 题解:回溯
P814
发布于2026年4月1日 11:41
阅读数 181

#include <bits/stdc++.h>
// 初始化全局标记数组(N最大10,对角线最大长度20)
int col[11] = {0};   // 标记列是否被占用:col[j]=1表示第j列有皇后
int diag1[21] = {0}; // 标记主对角线(左上→右下):行-列=定值,+10避免负数
int diag2[21] = {0}; // 标记副对角线(右上→左下):行+列=定值
int count;           // 统计合法解法数

// 回溯函数:row表示当前要放置皇后的行,n表示棋盘大小
void backtrack(int row, int n) {
    // 递归终止:所有行都放置了皇后,找到一种解法
    if (row == n) {
        count++;
        return;
    }
    // 遍历当前行的每一列,尝试放置皇后
    for (int j = 0; j < n; j++) {
        // 检查:当前列、主对角线、副对角线均未被占用
        if (!col[j] && !diag1[row - j + n] && !diag2[row + j]) {
            // 放置皇后,标记占用
            col[j] = 1;
            diag1[row - j + n] = 1;
            diag2[row + j] = 1;

            // 递归处理下一行
            backtrack(row + 1, n);

            // 回溯:撤销标记,尝试下一列
            col[j] = 0;
            diag1[row - j + n] = 0;
            diag2[row + j] = 0;
        }
    }
}

int main() {
    int n;
    // 循环读取输入,N=0时结束
    while (std::cin >>...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发