【重点】【回溯】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 皇后问题存在两个不同的解法。 阅读详情

相关推荐

中国IP发展之面面观

谢学军/邱善勤2006-1-25 9:29:28电子经理世界       IP远没有我们当初想象的那么简单   当SoC设计方法学刚刚传到国内的时候,学界为之欢呼雀跃,由于IP/SoC设计技术的使用,可以将发达国家用几年甚至十几年积累起来的设计技术直接为我所用,使中国的集成电路跳过漫长的积累阶段,迅速站到较高的起点上。因此在当时看来,IP/SoC设计技术是我国提升设计水平、发展

klxdmm305的专栏 1188

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

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

代码星辰的博客 517

一种4位sar adc仿真验证

4位sar adc采用下图的电容阵列,电路如下图:所有电容的正端(也称为上极板)与比较器的反相端连接,比较器同相端接Vin,其工作过程进行大致分析见之前的文章《一种4位sar adc工作过程推导(三)》,下面对这个电路进行仿真验证。 两个参考电压VrefPV_{refP}VrefP​和VrefNV_{refN}VrefN​,V+=VinV_{+}=V_{in}V+​=Vin​,假设1116(VrefP−VrefN)+VrefN<Vin<1216(VrefP−VrefN)+VrefN\frac{

大学生视野 1954

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

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

u012344335的博客 8769

PM1132-220V转5V电源芯片:SOT-23-3封装的高效电源解决方案

在现代电子设备小型化和高效化的趋势下,PM1132芯片凭借其的能力与特性,成为工业控制IoT设备及便携电器的理想电源管理方案。以下从核心技术设计挑战和应用实践展开分析。

M_D13Z476I000l的博客 804

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

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

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

m0_73776993的博客 588

点云去噪:基于点云拟合的方法

点云处理是计算机视觉中的重要任务之一,而点云去噪是点云处理的关键步骤之一。在实际应用中,由于采集设备的噪声、运动估计误差或者环境干扰等因素,点云数据中常常包含有噪声点,这些噪声点会对后续的点云分析和处理造成不良影响。一种简单的方法是计算点到拟合曲面的距离,并将距离超过某个阈值的点定义为噪声点,进行过滤。一种简单的方法是计算点到拟合曲面的距离,并将距离超过某个阈值的点定义为噪声点,进行过滤。该方法通过拟合点云数据的曲面模型,对噪声点进行识别和过滤,从而得到更加干净的点云数据。

AuSwift的博客 638

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

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

woshisfds的博客 186

OpenCV入门(一)Python环境的搭建

因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。

小幽余生不加糖 8121

【Windows Server 2019】Active Directory Certificate Services 证书颁发机构的安装,配置和管理Ⅰ——AD CS的安装和配置

博文主要介绍了Windows Server 2019的证书颁发机构的安装和配置方法。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 4833

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

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

qq_42218240的博客 143

C/C++跳动的爱心(完整代码)

C语言实现跳动的爱心的完整代码。

AIGC 5842

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

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

weixin_45734573的博客 313

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

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

A_2847443402的博客 867

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

m0_52114506的博客 829

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值