51. N 皇后
51. N 皇后困难按照国际象棋的规则皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题研究的是如何将n个皇后放置在n×n的棋盘上并且使皇后彼此之间不能相互攻击。给你一个整数n返回所有不同的n皇后问题的解决方案。每一种解法包含一个不同的n 皇后问题的棋子放置方案该方案中Q和.分别代表了皇后和空位。示例 1输入n 4 输出[[.Q..,...Q,Q...,..Q.],[..Q.,Q...,...Q,.Q..]] 解释如上图所示4 皇后问题存在两个不同的解法。示例 2输入n 1 输出[[Q]]提示1 n 9 核心笔记N 皇后 (N-Queens)1. 核心思想 (一句话总结)“一行只放一个三个数组定生死。”我们按行 (r) 递归每一行只在一个位置放皇后。为了快速判断某个位置 (r, c) 是否安全我们需要三个“记事本”布尔数组来记录哪些列、哪些主对角线、哪些副对角线已经被占用了。2. 核心难点对角线公式 (Math Magic)如何在时间内知道(r, c)属于哪条对角线列 (col)直接看c。副对角线 (/)r c是常数。例如(0, 2), (1, 1), (2, 0) 相加都是 2。主对角线 (\)r - c是常数。例如(0, 0), (1, 1), (2, 2) 相减都是 0。注意r - c可能是负数为了作为数组下标必须加上偏移量n - 1。即r - c n - 1。3. 算法流程 (三步走)准备记事本 (Init)初始化col,diag1(主),diag2(副) 三个数组。diag长度需为2n - 1。逐行尝试 (DFS)对于当前行r尝试每一列c。查表如果col[c]或diag1[rc]或diag2[r-coffset]为true跳过。占位设为true记录queens[r] c。递归r 1。回溯设为false(撤销占位)。生成棋盘 (Output)只有当r n时利用queens数组生成最终的字符串列表。 代码回忆清单 (带注释版)// 题目LC 51. N-Queens class Solution { public ListListString solveNQueens(int n) { ListListString ans new ArrayList(); // 技巧不用 char[][] board只用一个 int[] 记录每一行皇后所在的列即可 // queens[row] col 表示第 row 行的皇后在第 col 列 int[] queens new int[n]; // 核心优化三个 boolean 数组代替 O(N) 的遍历检查 boolean[] col new boolean[n]; boolean[] diag1 new boolean[n * 2 - 1]; // 主对角线 rc boolean[] diag2 new boolean[n * 2 - 1]; // 副对角线 r-coffset dfs(0, queens, col, diag1, diag2, ans); return ans; } private void dfs(int r, int[] queens, boolean[] col, boolean[] diag1, boolean[] diag2, ListListString ans) { int n col.length; // 1. Base Case: 所有行都放好了 if (r n) { // 将 int[] 状态转为 ListString 棋盘 ListString board new ArrayList(n); for (int c : queens) { char[] row new char[n]; Arrays.fill(row, .); row[c] Q; board.add(new String(row)); } ans.add(board); return; } // 2. 尝试当前行的每一列 for (int c 0; c n; c) { // 计算主对角线索引 (注意加偏移量防止负数) int rc r - c n - 1; // 3. 剪枝如果 这一列 OR 这条副对角线 OR 这条主对角线 被占了 if (!col[c] !diag1[r c] !diag2[rc]) { // 做选择 queens[r] c; col[c] true; diag1[r c] true; diag2[rc] true; // 递归下一行 dfs(r 1, queens, col, diag1, diag2, ans); // 撤销选择 (回溯) col[c] false; diag1[r c] false; diag2[rc] false; // queens[r] 不需要显式撤销因为会被下一次循环覆盖 } } } }⚡ 快速复习 CheckList (易错点)[ ]对角线数组多大2 * n - 1。推导r c最大值是(n-1) (n-1) 2n - 2下标从 0 开始所以大小是2n - 1。[ ]主对角线公式忘了记住“加法线” (/) 和 “减法线” (\)。diag1:r c。diag2:r - c (n - 1)。如果不加n-1(0, n-1)会算出负数下标。[ ]为什么不需要row数组因为我们的 DFS 逻辑就是dfs(r, ...)-dfs(r1, ...)每一层递归天然只处理一行绝不会在同一行放两个皇后所以不需要row数组检查。️ 数字演练假设N4当前在(0, 1)放了个皇后 (第 0 行第 1 列)。Mark:col[1] truediag1[01 1] truediag2[0-13 2] trueNext: DFS(1)(第 1 行)试(1, 0):col[0]OK.diag1[10 1]-False!(和 (0,1) 在同一副对角线上)。跳过。试(1, 1):col[1]-False!(同列)。跳过。试(1, 2):diag2[1-23 2]-False!(和 (0,1) 在同一主对角线上)。跳过。试(1, 3):全绿灯 -放(最终(0,1) - (1,3) - ...)

相关新闻

131. 分割回文串

131. 分割回文串

131. 分割回文串 中等 给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1: 输入:s "aab" 输出:[["a","a","b"],[…

2026/5/17 6:43:49 阅读更多 →
C#中的反射是什么?详细讲解以及在工控上位机中如何应用

C#中的反射是什么?详细讲解以及在工控上位机中如何应用

想深入理解 C# 中的反射机制,并且了解它在工控上位机开发这个特定场景下的具体应用,本会从基础概念到实际应用,由浅入深地为你讲解。一、C# 反射(Reflection)的核心概念1. 反射的定义反射是 C# 提供的一种强大机制&…

2026/7/3 10:41:31 阅读更多 →
C# 的开闭原则(OCP)在工控上位机开发中的具体应用

C# 的开闭原则(OCP)在工控上位机开发中的具体应用

了解 C# 的开闭原则(OCP)在工控上位机开发中的具体应用,这是一个非常贴合实际场景的问题 —— 工控上位机通常需要对接不同品牌 / 型号的 PLC、传感器,还要适配多变的工艺逻辑,OCP 能让这类系统的扩展和维护成本大幅降…

2026/5/17 6:43:48 阅读更多 →

最新新闻

《Vue3 从入门到大神20篇》环境变量与跨域处理 —— Vite 的配置秘籍

《Vue3 从入门到大神20篇》环境变量与跨域处理 —— Vite 的配置秘籍

前言在本地开发时,你的接口请求可能是这样的:axios.get(http://192.168.1.100:8080/api/users)但部署到生产环境后,后端地址变成了:https://api.example.com/api/users如果你把 IP 和端口硬编码在代码里,那每次部署都要…

2026/7/3 16:57:36 阅读更多 →
PIC18F85K22驱动WS2812实现动态光效系统

PIC18F85K22驱动WS2812实现动态光效系统

1. 项目概述:用WS2812与PIC18F85K22打造动态光效系统这个项目本质上是通过PIC18F85K22单片机驱动WS2812智能LED灯带,实现可编程的动态光效。WS2812作为集成了控制电路的三原色LED,每个像素点都能独立显示1600万种颜色,而PIC18F85K…

2026/7/3 16:50:52 阅读更多 →
SQL注入漏洞复现:从原理到实战,以红帆iOffice.net为例

SQL注入漏洞复现:从原理到实战,以红帆iOffice.net为例

1. 项目概述:一次典型的SQL注入漏洞复现之旅最近在整理内部安全审计的案例库,翻到了一个挺有意思的案例,是关于红帆iOffice.net办公系统的。这个系统在不少企事业单位里都有部署,算是比较常见。当时我们通过常规的资产梳理和漏洞扫…

2026/7/3 16:48:42 阅读更多 →
AI智能体与本地大模型集成:Hermes+Codex自动化工作流部署指南

AI智能体与本地大模型集成:Hermes+Codex自动化工作流部署指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚 Hermes 和 Codex 到底是什么,以及它们能一起做什么 看到“赛博牛马连续工作11小时”这个标题,…

2026/7/3 16:46:39 阅读更多 →
STM32L152ZD与MC74HC165A的工业级开关量采集方案

STM32L152ZD与MC74HC165A的工业级开关量采集方案

1. 为什么需要MC74HC165A与STM32L152ZD的组合 在工业控制和嵌入式系统设计中,我们经常遇到需要监控大量开关量信号的场景。传统做法是为每个输入信号分配一个GPIO引脚,这在8位或16位MCU时代会迅速耗尽宝贵的引脚资源。MC74HC165A这款8位并行输入/串行输出…

2026/7/3 16:42:38 阅读更多 →
macOS逆向工程实践:探索百度网盘客户端的功能修改机制

macOS逆向工程实践:探索百度网盘客户端的功能修改机制

macOS逆向工程实践:探索百度网盘客户端的功能修改机制 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 在macOS生态系统中,逆向工…

2026/7/3 16:42:38 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻