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不合法:
                    continue
                board[row][col] = 'Q'
                backtrack(row + 1)
                board[row][col] = '.'
对于问题2

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

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

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

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

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

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

        # 查看左上方是否有Q
        for 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)
                return

            for col in range(n):
                if not self.isValid(board, row, col):
                    continue
                board[row][col] = 'Q'
                backtrack(row + 1)
                board[row][col] = '.'
        backtrack(0)

        return res



    def isValid(self, board, row, col):
        n = len(board)

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

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

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

        return True


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字符加密A--E,B-F,W--A

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为选择结构编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、题目分析 三、解题 程序运行代码 #include<stdio.h> int main(){char c;cgetchar();if(c>a&&…

不想用了PVE了怎么办?那就迁移到VMware呗!

正文共&#xff1a;1111 字 20 图&#xff0c;预估阅读时间&#xff1a;1 分钟 有不少小伙伴用完PVE之后&#xff08;PVE8.0-2安装使用快速指导&#xff09;&#xff0c;跟我的感觉是一样的&#xff0c;就是有点拉胯&#xff0c;转而想换一个虚拟化软件&#xff0c;比如说VMwar…

【Java】注解(Annotation)

1.注解 就是lava代码里的特殊标记&#xff0c;比如:Override、Test等&#xff0c;作用是:让其他程序根据注解信息来决定怎么执行该程序。注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。 如下Override所示&#xff1a; 2.自定义注解 就是自己定义…

火爆进行中的抖音双11好物节,巨量引擎助5大行业商家开启爆单之路!

抖音双11好物节目前正在火热进行中&#xff0c;进入爆发期&#xff0c;各大商家“好招”频出&#xff0c;都想要实现高速增长。依托“人群、货品、流量”三大优势&#xff0c;巨量引擎一直都是商家生意增长的给力伙伴&#xff0c;在今年的抖音双11好物节&#xff0c;巨量引擎就…

第 371 场 LeetCode 周赛题解

A 找出强数对的最大异或值 I 模拟 class Solution { public:int maximumStrongPairXor(vector<int> &nums) {int n nums.size();int res 0;for (auto x: nums)for (auto y: nums)if (abs(x - y) < min(x, y))res max(res, x ^ y);return res;} };B 高访问员工 …

通信世界扫盲基础二(原理部分)

上次我们刚学习了关于通信4/G的组成和一些通识&#xff0c;今天我们来更深层次了解一些原理以及一些新的基础~ 目录 专业名词 LTE(4G系统) EPC s1 E-UTRAN UE UU X2 eNodeB NR(5G系统) NGC/5GC NG NG-RAN Xn gNodeB N26接口 手机的两种状态 空闲态 连接态 …

Halcon WPF 开发学习笔记(3):WPF+Halcon初步开发

文章目录 前言在MainWindow.xaml里面导入Halcon命名空间WPF简单调用Halcon创建矩形 前言 本章会简单讲解如何调用Halcon组件和接口&#xff0c;因为我们是进行混合开发模式。即核心脚本在平台调试&#xff0c;辅助脚本C#直接调用。 在MainWindow.xaml里面导入Halcon命名空间 …

Leetcode—765.情侣牵手【困难】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—765.情侣牵手 并查集置换环思路 参考自ylb 实现代码 class Solution { public:int minSwapsCouples(vector<int>& row) {int n row.size();int len n / 2;vector<int> p(len);iota(p.begin(), p.…

探索项目管理软件的多重用途和益处

项目管理软件俨然成了当下项目管理话题中的热门词条&#xff0c;作为一个辅助性管理工具&#xff0c;项目管理软件有什么用&#xff1f;真的值得购入吗&#xff1f; 什么是项目管理软件 顾名思义&#xff0c;项目管理软件就是指在项目管理过程使用的各种软件工具。项目管理软件…

「Verilog学习笔记」4bit超前进位加法器电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 timescale 1ns/1nsmodule lca_4(input [3:0] A_in ,input [3:0] B_in ,input C_1 ,output wire CO ,output wire [3:0] …

docker启动某个镜像一直restarting状态

因为微服务学习的需要&#xff0c;就需要在虚拟机中安装一下Nacos&#xff0c;可哪儿能想到使用docker ps命令一直显示nacos的状态是restarting。 经过一番测试&#xff0c;发现并不是执行代码的问题。上网查了一下&#xff0c;也找不到合适的答案&#xff0c;终于查到了是doc…

高级项目管理总结

目录 一、背景介绍二、思路&方案三、过程1.升维思考2.结构化3.心理、知识阶段检验4.微观 四、总结 一、背景介绍 天性对学习对考试充满敌意的我&#xff0c;转变为依赖学习谋生&#xff0c;再到后来书中自有黄金屋&#xff0c;到现在学习对我而言就如同一日三餐&#xff1…

【linux】centos7 yum安装mysql 5.7

查看系统中是否已安装 MySQL 服务 yum list installed | grep mysql下载 mysql57的 yum 源 wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm查看下载 ll 安装源 rpm -ivh mysql57-community-release-el7-8.noarch.rpm安装 MySQL yum install mysql…

TMSRL

Z是学到的子空间表征 辅助信息 作者未提供代码

HPV专家谭巍主任讲述:家庭日常有效预防HPV病毒的办法

HPV&#xff0c;即人乳头瘤病毒&#xff0c;是一种常见且具有传染性的微小DNA病毒。可以通过直接接触感染&#xff0c;也可以通过间接接触感染。在家庭生活中&#xff0c;预防HPV病毒传播十分重要。为了提高大众防范意识&#xff0c;下面劲松HPV防治诊疗中心主任谭巍将介绍一些…

yolo系列报错(持续补充ing)

文章目录 export GIT_PYTHON_REFRESHquiet解决 没有pt权重文件解决 python文件路径报错解决 读取文件列名报错解决 导入不同文件夹出错解决 megengine没有安装解决然后你发现它竟然还没有用 export GIT_PYTHON_REFRESHquiet 设置环境变量 GIT_PYTHON_REFRESH &#xff0c;这个…

JavaScript从入门到精通系列第三十五篇:JavaScript中的DOM简介

文章目录 前言 1&#xff1a;对象分类 2&#xff1a;宿主对象 一&#xff1a;DOM 1&#xff1a;dom简介 2&#xff1a;Dom概念图示 二&#xff1a;节点 1&#xff1a;节点概述 2&#xff1a;常用节点分类 3&#xff1a;节点模型示意图 4&#xff1a;节点属性 5&…

fetch函数没有默认超时时间的配置吗

chatgpt&#xff1a; https://chat.xutongbao.top/ 截至我知识的最后更新时间&#xff08;2023年&#xff09;&#xff0c;原生的 fetch API 在大多数浏览器中并没有内置的默认超时时间。这意味着如果你没有明确地设置一个超时期限&#xff0c;fetch 请求可能会永远挂起&…

数据结构-静态查找、二分查找、分块查找

静态查找 在静态查找表中&#xff0c;我们只允许下面两件事&#xff1a; 1.在查找表中查找某个记录是否在表中 2.查找表中记录的各个属性 动态查找 在动态查找表中&#xff0c;我们允许四件事&#xff1a; 1.在查找表中查找某个记录是否在表中 2.查找表中记录的各个属性…

国际阿里云:Windows实例中数据恢复教程!!!

在处理磁盘相关问题时&#xff0c;您可能会碰到操作系统中数据盘分区丢失的情况。本文介绍了Windows系统下常见的数据盘分区丢失的问题以及对应的处理方法&#xff0c;同时提供了使用云盘的常见误区以及最佳实践&#xff0c;避免可能的数据丢失风险。 前提条件 已注册阿里云账…