leetCode 51.皇后 + 回溯算法 + 图解 + 笔记

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

示例 1:

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

 示例 2:

输入:n = 1
输出:[["Q"]]

  1. 不能同行
  2. 不能同列
  3. 不能同斜线
  •  先检查将要摆放的位置是否满足这三个条件,如果满足则在这个位置放Q
bool isValid(int x,int y,vector<string>& chessboard,int n) {// 检查当前列是否有皇后for (int i = 0; i < x; i++) { // 这是一个剪枝if (chessboard[i][y] == 'Q') return false;}// 检查 45(左上角) 度角是否有皇后for(int i=x-1,j=y-1;i>=0 && j>=0;i--,j--) {if (chessboard[i][j] == 'Q') return false;}// 检查 135(右上角) 度角是否有皇后for(int i=x-1,j=y+1;i>=0 && j<n;i--,j++) {if (chessboard[i][j] == 'Q') return false;}return true;
}// n 为输入的棋盘大小;x 是当前递归到棋盘的第几行了
void backtracking(int n, int x, vector<string>& chessboard) {......for(int y=0;y<n;y++) {if(isValid(x, y, chessboard, n)==false) continue;chessboard[x][y] = 'Q'; // 放置皇后backtracking(n, x + 1, chessboard);chessboard[x][y] = '.'; // 回溯,撤销皇后}
}
  • 如果搜到了树的叶子节点, 表明找到了皇后们的合理位置了  
if(x == n) {result.push_back(chessboard);return;
}

 C++代码:

class Solution {
public:vector<vector<string>> result;bool isValid(int x,int y,vector<string>& chessboard,int n) {// 检查当前列是否有皇后for (int i = 0; i < x; i++) { // 这是一个剪枝if (chessboard[i][y] == 'Q') return false;}// 检查 45(左上角) 度角是否有皇后for(int i=x-1,j=y-1;i>=0 && j>=0;i--,j--) {if (chessboard[i][j] == 'Q') return false;}// 检查 135(右上角) 度角是否有皇后for(int i=x-1,j=y+1;i>=0 && j<n;i--,j++) {if (chessboard[i][j] == 'Q') return false;}return true;}// n 为输入的棋盘大小;x 是当前递归到棋盘的第几行了void backtracking(int n, int x, vector<string>& chessboard) {if(x == n) {result.push_back(chessboard);return;}for(int y=0;y<n;y++) {if(isValid(x, y, chessboard, n)==false) continue;chessboard[x][y] = 'Q'; // 放置皇后backtracking(n, x + 1, chessboard);chessboard[x][y] = '.'; // 回溯,撤销皇后}}vector<vector<string>> solveNQueens(int n) {vector<string> chessboard(n,string(n,'.'));backtracking(n,0,chessboard);return result;}
};
  • 时间复杂度: O(n!)
  • 空间复杂度: O(n)

参考和推荐文章、视频:

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://www.programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html#%E6%80%9D%E8%B7%AF这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Rd4y1c7Bq/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3回溯算法基本框架:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

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

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

相关文章

SpringBoot MyBatis连接数据库 查询数据(注解方式)

创建项目时选择依赖 配置数据库连接 在resources中的 application.properties 配置文件进行连接的配置 #驱动名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver#连接地址 spring.datasource.urljdbc:mysql://10.20.22.11:26954/canteen#数据库用户名 spring.d…

Docker下搭建MySQL主从复制

目录 主从复制简介 主从复制搭建 主从复制简介 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff0c;主数 据库一般是准实时的业务数据库。 主从复制的作用 做数据的热备。作为后备数据库&#xff0c;主数据库服务器故…

Spring Task 定时任务框架

Spring Task Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 Spring Task使用步骤 1). 导入maven坐标 spring-context&#xff08;已存在&#xff…

DLL缺失

DLL缺失 参考链接&#xff1a; 方法五&#xff0c;亲测有用

VLAN实验

题目要求 1.PC1和PC3所在接口为Access接口 2.PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6PC4可以访问PC5,但不能访问PC6PC5不能访问PC6 3.PC1/3与PC2/4/5/6不在同一网段 4.所有PC通过DHCP获取IP地址&#xff0c;且PC1/3可以正常访问PC2/4/5/6题目分析 1.将交换…

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

学习视频&#xff1a;孙哥说SpringMVC&#xff1a;结合Thymeleaf&#xff0c;重塑你的MVC世界&#xff01;&#xff5c;前所未有的Web开发探索之旅 衔接上文Spring MVC学习随笔-控制器(Controller)开发详解&#xff1a;控制器跳转与作用域&#xff08;一&#xff09; SpingMVC中…

基于SSM的职业高中智慧作业试题系统设计

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

Linux 系统渗透提权-Server2204

B-3:Linux 系统渗透提权 任务环境说明: 服务器场景:Server2204(关闭链接) 用户名:hacker 密码:123456 1.使用渗透机对服务器信息收集,并将服务器中 SSH 服务端口号作为 flag 提 交; Flag:2283/tcp

YOLOv5改进 | 添加ECA注意力机制 + 更换主干网络之ShuffleNetV2

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本文给大家介绍一种轻量化部署改进方式&#xff0c;即在主干网络中添加ECA注意力机制和更换主干网络之ShuffleNetV2&#xff0c;希望大家学习之后&#xff0c;能够彻底理解其改进流程及方法~&#xff01;&#x1f308; 目…

个人博客搭建保姆级教程-服务器篇

如果想要直接使用阿里云&#xff0c;将个人博客部署到公网上&#xff0c;可以看下第一部分的服务器选购。如果使用虚拟机的话&#xff0c;直接看第二部分即可。 一、阿里云服务器购买 可以考虑使用推广链接 云服务器ECS省钱攻略 购买&#xff0c; 点击立即购买之后选择 更多配…

基于英特尔平台及OpenVINO2023工具套件优化文生图任务

当今&#xff0c;文生图技术在很多领域都得到了广泛的应用。这种技术可以将文本直接转换为逼真的图像&#xff0c;具有很高的实用性和应用前景。然而&#xff0c;由于文生成图任务通常需要大量的计算资源和时间&#xff0c;如何在英特尔平台上高效地完成这些计算是一个重要的挑…

分布式事务有哪些解决方案?

本文我们来讨论下分布式事务的相关知识点。 分布式事务是分布式系统中非常重要的一部分&#xff0c;最典型的例子是银行转账和扣款&#xff0c;A 和 B 的账户信息在不同的服务器上&#xff0c;A 给 B 转账 100 元&#xff0c;要完成这个操作&#xff0c;需要两个步骤&#xff0…

Android11适配已安装应用列表

Android11适配已安装应用列表 之前做过已安装应用列表的适配&#xff0c;最近国内版SDK升级到33和隐私合规遇到很多问题&#xff0c;于是把已安装应用列表记录一下&#xff1a; 1、在Android11及以上的适配&#xff1a; package com.example.requestinsttallapplistdemoimpo…

RocketMQ领域模型详解

1、主题&#xff08;Topic&#xff09; 1.1、定义​ 主题是 Apache RocketMQ 中消息传输和存储的顶层容器&#xff0c;用于标识同一类业务逻辑的消息。 主题的作用主要如下&#xff1a; 定义数据的分类隔离&#xff1a; 在 Apache RocketMQ 的方案设计中&#xff0c;建议将不同…

【Docker实操】创建一个Nginx服务

一、不使用DockerFile 1、获取nginx官方镜像 docker pull nginx //拉取nginx官方镜像 docker image nginx //查看镜像2、创建项目目录 项目目录&#xff1a;/root/www2/nginx //如果当前目录在root mkdir www2 mkdir www2/nginx cd www2/nginx //进入项目目录3、创建源码文…

KRaft使用SASL_PLAINTEXT进行认证

需要有KRaft相关的基础&#xff0c;才行。可参阅之前学习记录Kafka 一、配置 首先需要了解SASL的含义&#xff0c;SASL全称为Simple Authentication and Security Layer&#xff0c;它主要是用于在客户端和服务器之间提供安全的身份验证机制。 Kafka 支持以下几种 SASL 验证…

MathType公式编辑器安装教程

一、下载 MathType7是一款可以帮助用户快速完成数学公式编辑的应用软件&#xff0c;这款软件适合在进行教育教学、科研机构、论文写作的时候使用。我们可以直接通过这款软件来获取到大量数学上使用到的函数、数学符号等内容&#xff0c;然后使用这些内容来完成公式编辑。 …

Shell循环:expect(一)

一、名词解释&#xff1a; 我们通过Shell可以实现简单的控制流功能&#xff0c;如&#xff1a;循环、判断等。但是对于需要交互的场合则必须通过人工来干预&#xff0c;有时候我们可能会需要实现和交互程序如ssh服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。E…

qt-C++笔记之addItem(), addWidget(), addLayout()

qt-C笔记之addItem(), addWidget(), addLayout() code review! 文章目录 qt-C笔记之addItem(), addWidget(), addLayout()0.《官方文档》相关示例截图1.ChatGPT解释2.《Qt 5.12实战》相关示例截图《Qt 5.12实战》&#xff1a;5.6 组合框 3.addWidget()4.addWidget()和addChil…

矢量图形设计软件CorelDRAW 2023 mac界面说明

CorelDRAW 2023 mac是一款专业的矢量图形设计软件&#xff0c;由Corel公司开发。它提供了广泛的创意工具和功能&#xff0c;旨在满足设计师、艺术家和创意专业人士的需求。 CorelDRAW 2023具有直观的用户界面和工作流程&#xff0c;使用户能够轻松创建各种类型的图形设计&#…