【重点】【回溯】51.N皇后

N皇后问题(回溯法经典问题) 理解回溯必先理解递归,有递归就一定有回溯。 阅读详情

题目

Python

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        all_res = []
        tmp_res = [['.']*n for _ in range(n)]
        self.solve(all_res, tmp_res, 0, n)
        return all_res

    def solve(self, all_res, tmp_res, layer, n):
        if layer == n:
            all_res.append([''.join(item) for item in tmp_res])
            return 
        for i in range(n):
            if self.is_valid(tmp_res, layer, i):
                tmp_res[layer][i] = 'Q'
                self.solve(all_res, tmp_res, layer+1, n)
                tmp_res[layer][i] = '.'
    
    def is_valid(self, tmp_res, x, y):
        n = len(tmp_res)
        # 纵向判断
        for i in range(x):
            if tmp_res[i][y] == 'Q':
                return False
        # 斜向判断
        i = 1
        while x-i>= 0 and y-i >= 0:
            if tmp_res[x-i][y-i] == 'Q':
                return False
            else:
                i += 1
        i = 1
        while x-i>= 0 and y+i < n:
            if tmp_res[x-i][y+i] == 'Q':
                return False  
            else:
                i += 1
        
        return True

Java

class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> res = new ArrayList<>();
        char[][] tmp = new char[n][n];
        for (int i = 0; i < n; ++i) {
            Arrays.fill(tmp[i], '.');
        }
        dfs(tmp, 0, res);

        return res;
    }

    public void dfs(char[][] tmp, int layer, List<List<String>> res) {
        int n = tmp.length;
        if (layer == n) {
            List<String> solu = new ArrayList<>();
            for (int k = 0; k < n; ++k) {
                solu.add(String.valueOf(tmp[k]));
            }
            res.add(solu);
            return;
        }
        for (int k = 0; k < n; ++k) {
            if (isValid(tmp, layer, k)) {
                tmp[layer][k] = 'Q';
                dfs(tmp, layer + 1, res);
                tmp[layer][k] = '.';
            }
        }
    }

    boolean isValid(char[][] tmp, int x, int y) {
        int n = tmp.length;
        for (int i = 0; i < n; ++i) {
            if (tmp[i][y] == 'Q' && i < x) {
                return false;
            }
        }
        int i = 1;
        while (x - i >= 0 && y - i >= 0) { 
            if (tmp[x - i][y - i] == 'Q') {
                return false;
            }
            ++i;
        }
        i = 1;
        while (x - i >= 0 && y + i < n) {
            if (tmp[x - i][y + i] == 'Q') {
                return false;
            }
            ++i;
        }
        
        return true;
    }
}
力扣第62题:N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的的解决方案。每一种解法包含一个不同的的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。n = 4如上图所示,4 皇后问题存在两个不同的解法。 阅读详情

相关推荐

Python实战:3种高效方法将txt转csv(附pandas对比测试)

本文针对Python中将txt文件转换为csv格式的需求,深度评测了open()、csv模块和pandas三种主流方法。通过详尽的性能对比测试,从执行效率、内存占用和适用场景等维度提供选型指南,帮助开发者根据数据规模与复杂度选择最高效的转换方案。

weixin_29073241的博客 261

LeetCode_回溯_困难_52.N皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回 n 皇后问题不同的解决方案的数量。

代码星辰的博客 517

MBIST --- PATR1.Memorybist测试原理

mem bist作为现在design设计中不可或缺的DFT设计内容,越发重要。本章节主要介绍mem bist组成部分,测试的原理以及注意事项。

sinat_27691203的博客 1万+

回溯法解决N皇后问题-java

参照LeetCode第51题的题干,N皇后是指将N个皇后放置在NXN的棋盘上,并且皇后之间不可以互相攻击,即其中任意两个皇后不能在同一行、同一列或者同一条斜线上。 四皇后的放置情况示例如下: 采用回溯法解决该问题时需要将搜索过程抽象成一颗树,只要搜索到达了树的叶子节点,则等于找到了所有皇后合理的放置位置。 其中三皇后问题的解决思路如下,注意三皇后是无解的: 将整个棋盘抽象为坐标轴,按照从上到下的顺序放置皇后,每一行放置一个后即可进行下一行的放置,过程如图: 对应的Java代码如下: .

u012344335的博客 8769

DeepSeek-OCR 本地部署使用教程(附完整环境配置与推理示例)

DeepSeek-OCR是由DeepSeek AI推出的开源OCR模型,支持高精度文档识别与结构化输出(如Markdown转换)。本文提供了详细的本地部署指南,包括系统要求(推荐Linux+A100 GPU)、环境配置(Python 3.12.9+PyTorch 2.6.0+CUDA 11.8)、模型下载及两种推理方式:高性能的vLLM(适合批量处理)和灵活的Transformers(适合调试)。支持多种分辨率模式和提示词模板,适用于合同识别、PDF转换等场景。常见问题包括显存优化和性能调优建议。

qq_58607032的博客 6721

全自动数据分析 - Claude Code Sub-Agents:自动化数据分析工厂

别忘了!claude code也是agent框架,类似langgraph,crewAI,autogen等等agent框架。我改造claude code搞一个数据分析智能体AI。试试看行不行!:让数据分析变得像聊天一样简单!

liangdabiao的博客 1072

Day12(回溯法)——LeetCode51.N皇后&39.组合总和

本文主要使用回溯法解决了LeetCode51N皇后问题和39组合总和问题。

m0_73776993的博客 588

构建AI Agent驱动的智能健康管理系统

数据碎片化:健康数据分散在不同的设备和平台中,难以统一管理和分析。个性化不足:健康管理方案通常是通用的,难以根据个人的健康状况实时调整。用户参与度低:用户难以获得及时、个性化的健康建议,导致健康管理效果不佳。AI Agent是一个能够感知环境、采取行动以实现目标的智能实体。根据智能体的智能水平,可以分为简单反应式智能体和复杂适应式智能体。实时监测健康数据。获取个性化的健康建议。收到健康风险预警。

AI天才研究院 749

LeetCode 51. N皇后问题详解:回溯算法全解析

N皇后问题是一个经典的回溯算法问题。给定一个整数 n,返回所有不同的 N皇后问题 的解决方案。每一种解法包含一个不同的棋盘布局,其中 'Q' 代表皇后,'.' 代表空位。

woshisfds的博客 186

微信小程序 - 实现嵌套H5页面唤起微信支付的实现方案+完整流程源码,微信小程序webview(H5页面)调用微信小程序支付,嵌套h5页面怎么实现小程序支付(Vue2/3移动端H5网页、公众号网页等)

h5嵌入微信小程序微信支付,H5网页嵌入到微信小程序内如何支付,微信小程序webview组件交互,内联h5页面并网页实现微信支付,微信H5页面实现微信小程序支付,微信小程序嵌套webview实现小程序微信支付,小程序中内嵌H5网页支付怎么办,用网页的支付还是小程序的支付?支付没反应,支付报错怎么办,微信小程序内嵌h5,h5调用小程序支付功能解决方案,H5网页cors跨域,真机测试无法唤起支付,无法唤起支付,uniapp微信小程序,h5小程序调用微信支付,微信小程序内嵌H5页面,如何实现微信支付功能,微信小程

🏆 前端领域优质创作者 1万+

如何在飞腾平台上安装Ubuntu操作系统

注意: 若主板上配置的是NVME硬盘,在进行内核配置时,需要将内核的NEME驱动勾选上,否则移植内核时,无法找到文件系统,进不去操作系统。可以通过rufus软件将镜像做到U盘中,本次使用版本为Rufus 3.9.124 ,其他版本也可以。不要下载live版本的,没有准备网络环境,是一个头疼的事情,笔者暂时没有实现网络安装。将U盘接到主板usb口上,接上串口,显示器,,必需串口有打印才可以安装。可以通过dd命令,将iso安装到U盘。安装的是最小系统,缺少很多命令,需要联网更新,或则更换飞腾专用内核。

技术联盟 2645

代码随想录算法训练营第三十天| 332 重新安排行程 51 N皇后 37 解数独

leetcode 332 重新安排行程 51 N皇后 37 解数独

qq_42218240的博客 143

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

leetcode思路-回溯最后一节(131.分割回文串、51.N皇后)

给你一个字符串s,请你将s分割成一些 子串,使每个子串都是。返回s所有可能的分割方案。

weixin_45734573的博客 313

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

代码随想录训练营第30天 | 总结、​​​​​​LeetCode 332.重新安排行程、​​​​​​LeetCode 51.N皇后、LeetCode 37.解数独

文章讲解:代码随想录(programmercarl.com)​​​​​​LeetCode 332.重新安排行程文章讲解:代码随想录(programmercarl.com)

A_2847443402的博客 867

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode 051. N皇后 - 回溯剪枝与位运算优化详解

题目描述:在 n×n 棋盘上摆放 n 个皇后,使其彼此之间不能相互攻击(任意两皇后不在同一行、同一列、同一主对角线、同一副对角线)。返回所有不同的摆放方案,每个方案用字符串数组表示,'Q' 表示皇后,'.' 表示空位。原题链接:https://leetcode.cn/problems/n-queens/难度等级:Hard相关标签:回溯、DFS、位运算、剪枝、搜索、排列构造| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 | 适用场景 |

m0_52114506的博客 829

Leetcode 51. N 皇后 回溯+剪枝 / 回溯+位运算

本文介绍了N皇后问题的两种回溯解法:朴素回溯和优化剪枝解法。第一种解法通过检查列和两个对角线方向来判断皇后位置是否合法,时间复杂度较高;第二种解法利用两个布尔数组分别记录主对角线和副对角线的占用情况,通过数学公式(i-j+n-1和i+j)快速计算对角线索引,显著提高了效率。两种方法都采用深度优先搜索策略,当找到合法解时记录棋盘状态。文章还提到后续会补充位运算优化的解法,进一步降低空间复杂度。

想买很多漂亮衣服但是买不起的博客 298

[leetcode-N皇后问题]

leetcode 51 N皇后问题 1 基于集合的回溯 1 每次调用都是对给定row的位置求解。 2 皇后所在的列column 跟 其主对角线、副对角线的位置都可以用一个数值表示,记录了已摆放好的k个皇后的column、主对角线、副对角线就记录了棋盘上已被占据的势力范围。 3 此处queens和columns存放数据的逻辑是一样的,之所以用两个数据结构重复存储相同的值,原因是:1)vector数据类型是按顺序存取,后续用[…Q…]字符串表示solution时会用到数据的下标所蕴含的信息,此时不可用hash

qq_43118572的博客 285

LeetCode 51. N 皇后

本文介绍了使用回溯算法解决N皇后问题的方案。该问题要求在N×N棋盘上放置N个互不攻击的皇后,每个皇后不能处于同一行、列或对角线。算法采用逐行放置策略,通过三个布尔数组(col、diag1、diag2)快速检测冲突位置。关键步骤包括:递归处理每一行,尝试各列放置皇后,标记占用状态后递归处理下一行,找到解后构建字符串表示。文章强调了回溯中状态恢复的重要性,并指出了常见错误(如数组越界、路径构建不当等)。最终解决方案的时间复杂度为O(n*n!),空间复杂度为O(n)。

zander258的博客 330

Day26: 332.重新安排行程,51. N皇后,37. 解数独,总结

简单记录~

Frank_Yan 's Blog 106

代码随想录算法训练营第三十天| 51. N 皇后

day30

joanna 162

DAY30:回溯算法332\51\37基本思路了解+总结

组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等。

weixin_43799497的博客 1016

2.26 回溯算法终极巩固 组合 只出现一次的数II N皇后

本文探讨了三道回溯算法经典题目:组合、全排列II和N皇后问题。组合问题通过限制后续数字必须大于前面数字来避免重复;全排列II通过排序和used数组巧妙处理重复数字的去重;N皇后问题则采用逐行回溯和int类型used数组记录攻击范围。文章重点分析了全排列II中!used[i-1]条件的深层含义,指出这是实现深度剪枝的关键。这些题目展示了回溯算法在不同场景下的应用技巧,特别是剪枝策略在解决重复问题和优化搜索空间方面的重要作用。

2302_79054971的博客 1044

[LeetCode] 51、N皇后

题目描述 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ...

aift的专栏 296

代码随想录算法训练营第30天 | LeetCode332.重新安排行程,51. N皇后,37. 解数独

代码随想录算法训练营第30天 | LeetCode332.重新安排行程,51. N皇后,37. 解数独。

weixin_46724054的博客 216

算法题解记录-51N皇后问题

回溯法的核心:尝试 -> 检查 -> 递归 -> 回溯对角线判断技巧主对角线:行-列值相等副对角线:行+列值相等数据结构选择:使用数组而不是列表可以更高效地检查和更新状态剪枝优化:在放置皇后前检查冲突,避免无效递归。

weixin_62411896的博客 426
上一篇: 【重点】【回溯】79.单词搜索
下一篇: 【重点】【回溯】131.分割回文串
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值