LeetCode-题目整理【12】:N皇后问题--回溯算法

注意点,语法:
=一定要记得初始化内层数组的长度:board[i] = make([]rune, n),否则就会报出现越界的错

    // 第1步,初始化二维数组,内层数组长度为0,外层为nboard :=make([][]rune,n)for i:=0;i<n;i++{// 第2步,内层数组初始化为nboard[i] = make([]rune, n)for j:=0;j<n;j++{board[i][j]='.'}}

对于byte、rune和string的区别,在初始化二维数组时要注意类型
参考之前写:
https://blog.csdn.net/qq_45927881/article/details/135431178?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135431178%22%2C%22source%22%3A%22qq_45927881%22%7D


  1. 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”]]
func solveNQueens(n int) [][]string {var result [][]string// 第1步,初始化二维数组,内层数组长度为0,外层为nboard := make([][]rune, n)for i := 0; i < n; i++ {// 第2步,内层数组初始化为nboard[i] = make([]rune, n)for j := 0; j < n; j++ {board[i][j] = '.'}}// 函数 isSafe 用于检查在给定位置 (row, col) 放置皇后是否安全,即不与已放置的皇后冲突。var isSafe func(row, col int) boolisSafe = func(row, col int) bool {// 为什么不需要检查同一行是否有皇后://是因为在下面的函数backtrack中,是遍历每一行,即只要每一行放置一个皇后,就到下一行,所以不会存在一行又多个皇后的问题// 检查同一列是否有皇后for i := 0; i < row; i++ {if board[i][col] == 'Q' {return false}}// 检查左上方是否有皇后for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {if board[i][j] == 'Q' {return false}}// 检查右上方是否有皇后for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 {if board[i][j] == 'Q' {return false}}return true}// 函数 backtrack 用于递归地尝试所有可能的皇后放置位置,当放置完成所有皇后时,将当前的棋盘状态加入到结果中。var backtrack func(row int)backtrack = func(row int) {if row == n {var solution []stringfor _, row := range board {solution = append(solution, string(row))}result = append(result, solution)return}for col := 0; col < n; col++ {if isSafe(row, col) {board[row][col] = 'Q'//只要每一行放置一个皇后,就到下一行,所以不会存在一行又多个皇后的问题backtrack(row + 1)board[row][col] = '.'}}}backtrack(0)return result
}

下面这道题与上面的区别就是返回的结果,因此只需要将上面返回的结果,变成统计个数,即可解答下面这道题。其余解答过程一摸一样

  1. N 皇后 II
    困难
    n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
    给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
    示例 1:
    输入:n = 4
    输出:2
    解释:如上图所示,4 皇后问题存在两个不同的解法。
    示例 2:
    输入:n = 1
    输出:1
func totalNQueens(n int) int {count:=0// 第1步,初始化二维数组,内层数组长度为0,外层为nboard := make([][]rune, n)for i := 0; i < n; i++ {// 第2步,内层数组初始化为nboard[i] = make([]rune, n)for j := 0; j < n; j++ {board[i][j] = '.'}}// 函数 isSafe 用于检查在给定位置 (row, col) 放置皇后是否安全,即不与已放置的皇后冲突。var isSafe func(row, col int) boolisSafe = func(row, col int) bool {// 为什么不需要检查同一行是否有皇后://是因为在下面的函数backtrack中,是遍历每一行,即只要每一行放置一个皇后,就到下一行,所以不会存在一行又多个皇后的问题// 检查同一列是否有皇后for i := 0; i < row; i++ {if board[i][col] == 'Q' {return false}}// 检查左上方是否有皇后for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {if board[i][j] == 'Q' {return false}}// 检查右上方是否有皇后for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 {if board[i][j] == 'Q' {return false}}return true}// 函数 backtrack 用于递归地尝试所有可能的皇后放置位置,当放置完成所有皇后时,将当前的棋盘状态加入到结果中。var backtrack func(row int)backtrack = func(row int) {if row == n {count++return}for col := 0; col < n; col++ {if isSafe(row, col) {board[row][col] = 'Q'//只要每一行放置一个皇后,就到下一行,所以不会存在一行又多个皇后的问题backtrack(row + 1)board[row][col] = '.'}}}backtrack(0)return count
}// 可以使用回溯算法来解决。// 算法的时间复杂度取决于皇后的数量,即 O(N!),其中 N 是棋盘的大小。在最坏情况下,需要遍历所有的排列组合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用virtualenv管理python环境

Windows配置virtualenv 安装 pip install virtualenv virtualenvwrapper virtualenvwrapper-win设置WORK_HOME环境变量 在系统path变量中添加虚拟环境目录&#xff1a;键WORKON_HOMEC:dev\Envs 修改windows环境下mkvirtualenv.bat文件&#xff0c;配置虚拟环境根目录地址 配…

python-自动化篇-运维-监控-简单实例-道出如何使⽤Python进⾏网络监控?

如何使⽤Python进⾏⽹络监控&#xff1f; 使⽤Python进⾏⽹络监控可以帮助实时监视⽹络设备、流量和服务的状态&#xff0c;以便及时识别和解决问题。 以下是⼀般步骤&#xff0c;说明如何使⽤Python进⾏⽹络监控&#xff1a; 选择监控⼯具和库&#xff1a;选择适合⽹络监控需…

蓝桥杯省赛无忧 课件49 DFS-剪枝

01 数字王国之军训排队 02 特殊的三角形 03 特殊的多边形

优雅的python(二)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

【docker】linux系统docker的安装及使用

一、docker应用的安装 1.1 安装方式 Docker的自动化安装&#xff0c;即使用提供的一键安装的脚本&#xff0c;进行安装。 官方的一键安装方式&#xff1a;curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 国内 daocloud一键安装命令&#xff1a;curl -s…

二刷代码随想录|Java版|回溯算法1|回溯基础理论+组合问题

理论 写链表之类的真的很痛苦&#xff0c;赶紧跳到回溯&#xff01;这次我想结合算法设计这本书&#xff0c;把java版写出来。放在第三部分吧。希望能够在研一完成这项工作&#xff01; 从一刷总结以下的几个要点&#xff1a; 回溯方法模板性非常强&#xff01;&#xff01;可…

企业虚拟机服务器中了lockbit3.0勒索病毒怎么办,lockbit3.0勒索病毒解密处理流程

对于企业来说&#xff0c;企业的数据是企业的核心命脉&#xff0c;关乎着企业的生产与运营的所有工作。随着网络技术的不断发展&#xff0c;网络安全威胁也在不断增加。近期&#xff0c;云天数据恢复中心接到了很多企业的求助&#xff0c;企业的虚拟机服务器遭到了lockbit3.0勒…

Unity MonoBehaviour 生成dll

dllllllllllllll&#x1f953; &#x1f959;vs创建类库项目&#x1f9c0;添加UnityEngine、UnityEditor引用&#x1f355;添加MonoBehaviour类&#x1f9aa;设置dll生成路径&#x1f37f;生成dll&#x1f354;使用dll中的Mono类 &#x1f959;vs创建类库项目 &#x1f9c0;添加…

网络安全攻防红队常用命令

command 收集渗透中会用到的常用命令 。 建议直接[CtrlF]查找 java命令执行 如下编码网站&#xff1a; https://ares-x.com/tools/runtime-exec/ https://r0yanx.com/tools/java_exec_encode/ https://www.bugku.net/runtime-exec-payloads/ 手动编码操作 bash -c {echo,…

网络安全产品之认识安全隔离网闸

文章目录 一、什么是安全隔离网闸二、安全隔离网闸的主要功能三、安全隔离网闸的工作原理四、安全隔离网闸的分类五、安全隔离网闸与防火墙的区别四、安全隔离网闸的应用场景 随着互联网的发展&#xff0c;网络攻击和病毒传播的方式越来越复杂&#xff0c;对网络安全的要求也越…

Nginx进阶篇【五】

Nginx进阶篇【五】 八、Nginx实现服务器端集群搭建8.1.Nginx与Tomcat部署8.1.1.环境准备(Tomcat)8.1.1.1.浏览器访问:8.1.1.2.获取动态资源的链接地址:8.1.1.3.在Centos上准备一个Tomcat作为后台web服务器8.1.1.4.准备一个web项目&#xff0c;将其打包为war8.1.1.5.启动tomcat进…

C# 中比较时间的大小,看当前时间处于哪个时间段

文章目录 比较时间的大小初始数据转换成TimeSpan格式&#xff0c;以进行比较。更新一下时间当前时间在哪个时间段自定义时间在哪个段中&#xff1f; 代码如诗系列。 C# 中比较两个时间的大小&#xff08;不含日期DateTime&#xff09;&#xff0c;仅使用时间模块。C# 中看当前时…

基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的语音智能助手

文章目录 一、效果演示二、操作步骤三、架构解析 一、效果演示 各位读者你们好&#xff0c;我最近在研究一个语音助手的项目&#xff0c;是基于GPT3.5网页版的逆向和本地BertVits2-2.3 文字转语音&#xff0c;能实现的事情感觉还挺多&#xff0c;目前实现【无需翻墙&#xff0…

ubuntu20.04 安装ROS2 记录

主要参考B站古月居的ROS2入门21讲 和 以下链接&#xff08;基本和视频上一致&#xff09; ubuntu20.04安装ROS2 详细教程_ubuntu20.04 ros2-CSDN博客 但是中间有些需要注意的地方&#xff0c; 1&#xff0c;添加源 步骤中提到 sudo curl -sSL https://raw.githubuserconten…

LaTeX基础使用【系列四】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;LaTeX基础使用 &#x1f984;1 LaTeX的多行数学公式&#x1f420;1.1 导入包&#x1f420;1.2 gather环境&#xff1a;多行公式&#x1f420;1.3 gather\* &#xff1a;无编号公式&#x1…

Codeforces Round 921 (Div. 2)

A. We Got Everything Covered! 题意&#xff1a;有任意由前k个字母组成的长度为n的字符串s1&#xff0c;你需要构建一个字符串s2&#xff0c;使s1恒为s2的子串&#xff08;注意是子串&#xff0c;不是连续子串&#xff09; 分析&#xff1a;我们可以构造n组字符串&#xff0c…

深入Pyecharts:桑基图绘制与炫酷效果实战【第38篇—python:桑基图】

文章目录 深入Pyecharts&#xff1a;桑基图绘制与炫酷效果实战桑基图简介安装 Pyecharts简单桑基图的绘制自定义桑基图的炫酷效果高级样式定制 多组数据桑基图的展示动态桑基图的绘制结合真实数据的桑基图案例导出和分享进阶应用&#xff1a;桑基图与其他图表的组合总结 深入Py…

代码随想录算法训练59 | 单调栈part02

503.下一个更大元素II 这道题和 739. 每日温度 几乎如出一辙&#xff0c;可以自己尝试做一做 代码随想录 42. 接雨水 接雨水这道题目是 面试中特别高频的一道题&#xff0c;也是单调栈 应用的题目&#xff0c;大家好好做做。 建议是掌握 双指针 和单调栈&#xff0c;因为在面…

Ps:渐变编辑器

渐变编辑器 Gradient Editor可用于创建和编辑自定义渐变&#xff0c;它提供了详细的控制选项&#xff0c;能够精确地调整渐变的颜色、样式和效果。 提示&#xff1a; 拖动边框或边角可缩放渐变编辑器窗口。 预设 Presets 提供了大量的渐变预设。还可通过右侧按钮新建 New、导入…

LC 2861. 最大合金数

2861. 最大合金数 难度&#xff1a; 中等 题目大意&#xff1a; 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需要特定数量的每种金属来创建…