leetcode(力扣) 51. N 皇后 (回溯,纸老虎题)

文章目录

  • 题目描述
  • 思路分析
        • 对于问题1
        • 对于问题2
  • 完整代码

题目描述

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

在这里插入图片描述

输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

思路分析

【这道题不难,相信我】
【这道题不难,相信我】
【这道题不难,相信我】
【这道题不难,相信我】
【这道题不难,相信我】
【这道题不难,相信我】
【这道题不难,相信我】
【这道题不难,相信我】

我知道很多兄弟看到这个题就直接不读题劝退了,实际上这道题没那么难,我觉得甚至没有那道中等难度的电话号码组合回溯题难。

首先,解释一下题目。压根不用管什么国际象棋。

就是给一个二维数组, n*n的。里面可以放一个棋子(题目叫皇后),这个棋子必须满足三个特性:行, 列, 对角线 均只有一个,跟数独一样。

直接回溯,开始画树。

偷了张图,方便理解:

在这里插入图片描述

上面这棵树可以理解成,每一层就是遍历二维数组的每一行,然后暴力穷举放置皇后Q这个棋子,看看是否合法。

那么这道题就转换成要解决两个问题:

  • 问题1:穷举所有皇后棋子Q的放置情况
  • 问题2:判断放置棋子后是否合法
对于问题1

这个很好解决啊,做过回溯的应该都能秒解。

我们设置当前遍历的行为row。
题目给的值为n,表示n*n的二维数组。

回溯终止条件:

当前遍历的row是最后一行的时候,也就是row==n的时候,终止。
将当前Q的放置方案加入答案集。
注意,这里并不需要判断放置方案是否合法,因为合法性在前面已经判断过了,不合法的不会走到这一步。

			if row == n:tmp = [''.join(i) for i in board]res.append(tmp)return

遍历回溯体:

这里没得说,先判断合法性,不合法直接循环下一轮,合法的话,当前位置放皇后,然后继续往下一层遍历。

      		for col in range(n):# 如果当前放皇后Q不合法:continueboard[row][col] = 'Q'backtrack(row + 1)board[row][col] = '.'
对于问题2

这个也不难。就是判断当前防止皇后Q的位置是否合法。
当前层的Q是否合法,其实就是判断他的行,列,对角线是否有Q。因为下面的还没遍历嘛,肯定没有Q,所以不用判断。

行:不用判断,这一点直接看上面那个图就知道了,每一行都是放了一个,合法就往下走不合法就遍历一下个位置了。

列:实际上是判断当前位置的正上方有没有Q。

		# 查看正上方是否有Qfor i in range(row):if board[i][col] == 'Q':return False

对角线:分为正负对角线。其实就是 当前位置的左上方对角线和右上方对角线有没有Q

		# 查看右上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):if board[i][j] == 'Q':return False# 查看左上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):if board[i][j] == 'Q':return False

完整代码

class Solution:def solveNQueens(self, n: int) -> List[List[str]]:# 从上往下放棋子# row表示当前遍历的是第几行,也就是树的第几层board = [['.'] * n for _ in range(n)]res = []def backtrack(row):n = len(board)# 如果到最后一行了,则将结果添加到res里if row == n:tmp = [''.join(i) for i in board]res.append(tmp)returnfor col in range(n):if not self.isValid(board, row, col):continueboard[row][col] = 'Q'backtrack(row + 1)board[row][col] = '.'backtrack(0)return resdef isValid(self, board, row, col):n = len(board)# 查看上方是否有Qfor i in range(row):if board[i][col] == 'Q':return False# 查看右上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):if board[i][j] == 'Q':return False# 查看左上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):if board[i][j] == 'Q':return Falsereturn True

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

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

相关文章

基于SSM的数据结构课程网络学习平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

链表OJ题(4)

目录 10.链表的回文结构 11.随机链表的复制 🙂找中间节点一定要考虑偶数个和奇数个的问题。 🙂指针指向的前中后。 🙂链表节点的位置个数/链表的节点中的数字。🆗🆗 今天最后两道链表OJ题目。 10.链表的回文结构…

Java,多线程,线程安全的懒汉式、死锁、ReentrantLock的使用以及一些知识点补充

关于线程安全地懒汉式有以下几种方式: /*** 实现线程安全的懒汉式*/ public class BankTest {Bank b1 null;Bank b2 null;public static void main(String[] args){BankTest bb new BankTest();Thread t1 new Thread(){Overridepublic void run(){bb.b1 Bank.…

物联网AI MicroPython学习之语法 network网络配置模块

学物联网,来万物简单IoT物联网!! network介绍 模块功能: 用于管理Wi-Fi和以太网的网络模块参考用法: import network import time nic network.WLAN(network.STA_IF) nic.active(True) if not nic.isconnected():…

.net在使用存储过程中IN参数的拼接方案,使用Join()方法

有时候拼接SQL语句时&#xff0c;可能会需要将list中的元素都加上单引号&#xff0c;并以逗号分开&#xff0c;但是Join只能简单的分开&#xff0c;没有有单引号&#xff01; 1.第一种拼接方案 List<string> arrIds new List<string>(); arrIds.Add("aa&qu…

nginx https 如何将部分路径转移到 http

nginx https 如何将部分路径转移到 http 我有一个自己的网站&#xff0c;默认是走的 https&#xff0c;其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径&#xff0c;并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…

开源:特殊的垄断

免责声明&#xff1a;本博客旨在分享我对开源策略的理解和体会&#xff0c;不代表任何组织或机构的立场或观点&#xff0c;也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏&#xff0c;也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…

LeetCode(7)买卖股票的最佳时机【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 121. 买卖股票的最佳时机 1.题目 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票…

通过创建自定义标签来扩展HTML

使用HTML时&#xff0c;例如&#xff0c;使用<b>标记显示粗体文本。 如果需要列表&#xff0c;则对每个列表项使用<ul>标记及其子标记<li> 。 标签由浏览器解释&#xff0c;并与CSS一起确定网页内容的显示方式以及部分内容的行为。 有时&#xff0c;仅使用一…

multilinear多项式承诺方案benchmark对比

1. 引言 前序博客有&#xff1a; Lasso、Jolt 以及 Lookup Singularity——Part 1Lasso、Jolt 以及 Lookup Singularity——Part 2深入了解LassoJolt Lasso lookup中&#xff0c;multilinear多项式承诺方案的高效性至关重要。 本文重点关注4种multilinear多项式承诺方案的实…

启动Docker服务后显示Docker Engine stopped

1、重新启动Docker服务&#xff1a;打开Windows服务管理器&#xff08;可以在开始菜单中搜索&#xff09;&#xff0c;找到"Docker Desktop Service"或类似命名的服务&#xff0c;右键单击并选择"重启"。稍等片刻&#xff0c;看看是否重新启动成功 2、尝试…

k8s二进制(ETCD的部署安装)

角色ip组件k8s-master192.168.11.169kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-node1192.168.11.164kubelet,kube-proxy,docker,etcdk8s-node2192.168.11.166kubelet,kube-proxy,docker,etcd 1、为etcd签发证书 1、证书的下载(任意机器上执行都可以) …