当前位置: 首页 > news >正文

N皇后问题(dfs回溯)

#include <bits/stdc++.h>
using namespace std;

const int N = 10; 
int n, ans = 0;
bool a[N], b[2 * N], c[2 * N]; // 列、主对角线、副对角线占用情况

void f(int i) {
    if (i == n+1) { // 成功放置 N 个皇后
        ans++;
        return;
    }
    
    for (int j = 1; j <= n; j++) { // 遍历当前行的所有列
        if (!a[j] && !b[i - j + n] && !c[i + j]) { // 判断是否可放置
            a[j] = b[i - j + n] = c[i + j] = true; // 标记占用
            f(i + 1); // 递归尝试下一行
            a[j] = b[i - j + n] = c[i + j] = false; // 回溯,恢复状态
        }
    }
}

int main() {
    cin >> n;
    f(1); // 从第 1 行开始放置皇后
    cout << ans;
    return 0;
}

每次放置时,检查当前放置的皇后是否会与已放置的皇后发生冲突(检查列、主对角线、副对角线)

如果合法,就继续尝试放置下一个皇后

如果到达了棋盘的最后一行,且所有皇后都成功放置,则记录一种有效的解

回溯“恢复状态”,撤销当前的选择,并尝试其他可能的选择

a[N]: 用于标记每一列是否已被占用。

b[2 * N]: 用于标记每一条主对角线是否已被占用。主对角线的编号是 i - j + n,表示 (i, j) 位置上的皇后是否在该主对角线上。

c[2 * N]: 用于标记每一条副对角线是否已被占用。副对角线的编号是 i + j,表示 (i, j) 位置上的皇后是否在该副对角线上。

对于b[i - j + n]

  • i - j:表示当前位置 (i, j) 所在的主对角线的编号。比如,i - j == 0 表示该位置位于主对角线的中心(即 (0,0)(n-1,n-1) 的对角线),i - j == -1i - j == 1 表示其他副对角线。
  • 为什么要+ n:由于 i - j 可能是负数(如 i = 1, j = 2i - j = -1),我们将其偏移,使得所有的对角线编号都变为非负数。这样就能保证数组 b 访问时不会越界。
对于c[i + j]
  • i + j:表示当前位置 (i, j) 所在的副对角线的编号。比如,i + j == 0 表示该位置位于副对角线的起点(即 (0, n-1)(n-1, 0) 的对角线),i + j == 1i + j == n-1 表示其他副对角线。

通过这三个数组,可以有效地判断在放置皇后时,某个位置 (i, j) 是否会与其他皇后发生冲突,确保解法的有效性。

递归终止条件:当 i == n + 1 时,表示已经成功放置了 n 个皇后,此时我们增加答案 ans,并返回。

http://www.dtcms.com/a/109820.html

相关文章:

  • 如何把网页文章转为pdf保存
  • 计算机网络基础:容灾备份与业务连续性保障
  • 在 Ubuntu 上离线安装 Prometheus 和 Grafana
  • GMS测试环境搭建二——aapt2报错
  • Kafka配置内外网访问(解决kafka外网访问broker超时)
  • Pytorch中预置数据集的加载方式
  • 斜方肌科学训练原则:上斜方肌多牵拉放松,中下斜方肌多锻炼强健。 | 告别圆肩驼背、“富贵包”
  • 第十四届蓝桥杯大赛软件赛省赛Python 研究生组:4.互质数的个数
  • Python星球日记 - 第2天:数据类型与变量
  • Android U 分屏——分割线相关
  • 基于ANSYS 概率设计和APDL编程的结构可靠性设计分析
  • mqtt封装与使用
  • 大模型面试题
  • SSL/TLS
  • 【系统架构设计师】系统架构评估中的重要概念
  • 几何法证明卡特兰数_栈混洗
  • 代码随想录|动态规划|21组合总和IV
  • 从零开始:使用Spring Boot和MyBatis实现CRUD操作全攻略
  • 25.Reactor
  • PHP代码审计-01
  • RAGFlow 知识库分段研究
  • 码界奇缘 Java 觉醒 第一章 命运的终端
  • 数据驱动防灾:AI 大模型在地质灾害应急决策中的关键作用。基于DeepSeek/ChatGPT的AI智能体开发
  • 关于inode,dentry结合软链接及硬链接的实验
  • 线性代数:分块矩阵,秩,齐次线性,非齐次线性的解相关经典例题
  • 带头结点 的单链表插入方法(头插法与尾插法)
  • 纪检委行业光盘安全隔离与数据摆渡应用方案
  • 笔记:背包问题总结
  • 【PHP】- 项目通用目录架构及示例demo
  • 【LLM之评测】AlignBench: Benchmarking Chinese Alignment of Large Language Models