当前位置: 首页 > news >正文

LeetCode——51. N 皇后

一、题目

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
在这里插入图片描述
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/n-queens/description/

二、C++解法

我的思路及代码

采用回溯的思想。这里需要一个判断的函数 isValid ,来处理当前位置是否是可选的位置。每一次选择的时候都会前进一行,然后在当前行中,选择可用的列。如果这个列是可用的那么就可以选择此路径,然后继续后面的回溯,如果不可用则继续往下找。本质是一个全排列的问题。由于我们的方式是从一行一行的往下找,那么在 isValid 中,就不必判定左下角和右下角的合理情况,这必然是可选的。

class Solution {
public:vector<vector<string>> ans;bool isValid(int &row,int &col,vector<string> &temp){int rowTemp = row;int colTemp = col;//判断列有没有棋子for(int i=0;i<temp.size();i++){if(temp[i][col] == 'Q')return false;}//判断左上有没有棋子for(;rowTemp>=0&&colTemp>=0;rowTemp--,colTemp--){if(temp[rowTemp][colTemp] == 'Q')return false;}//判断右上有没有棋子for(rowTemp = row,colTemp = col;rowTemp>=0&&colTemp<temp.size();rowTemp--,colTemp++){if(temp[rowTemp][colTemp] == 'Q')return false;}return true;}void backtrance(vector<string> &temp,int row){if(row==temp.size()){ans.push_back(temp);return;}for(int col=0;col<temp.size();col++){if(isValid(row,col,temp)){temp[row][col] = 'Q';backtrance(temp,row+1);temp[row][col] = '.';}}}vector<vector<string>> solveNQueens(int n) {vector<string> temp(n,string(n,'.'));backtrance(temp,0);return ans;}
};
  • 时间复杂度:O(N!),其中 N 是皇后数量
  • 空间复杂度:O(N),其中 N 是皇后数量。空间复杂度主要取决于递归调用层数、记录每行放置的皇后的列下标的数组以及三个集合,递归调用层数不会超过 N,数组的长度为 N,每个集合的元素个数都不会超过 N

官方参考代码

方法一:基于集合的回溯

采用了集合的方式来存储各个线上皇后的情况,本质还是回溯算法。

class Solution {
public:vector<vector<string>> solveNQueens(int n) {auto solutions = vector<vector<string>>();auto queens = vector<int>(n, -1);auto columns = unordered_set<int>();auto diagonals1 = unordered_set<int>();auto diagonals2 = unordered_set<int>();backtrack(solutions, queens, n, 0, columns, diagonals1, diagonals2);return solutions;}void backtrack(vector<vector<string>> &solutions, vector<int> &queens, int n, int row, unordered_set<int> &columns, unordered_set<int> &diagonals1, unordered_set<int> &diagonals2) {if (row == n) {vector<string> board = generateBoard(queens, n);solutions.push_back(board);} else {for (int i = 0; i < n; i++) {if (columns.find(i) != columns.end()) {continue;}int diagonal1 = row - i;if (diagonals1.find(diagonal1) != diagonals1.end()) {continue;}int diagonal2 = row + i;if (diagonals2.find(diagonal2) != diagonals2.end()) {continue;}queens[row] = i;columns.insert(i);diagonals1.insert(diagonal1);diagonals2.insert(diagonal2);backtrack(solutions, queens, n, row + 1, columns, diagonals1, diagonals2);queens[row] = -1;columns.erase(i);diagonals1.erase(diagonal1);diagonals2.erase(diagonal2);}}}vector<string> generateBoard(vector<int> &queens, int n) {auto board = vector<string>();for (int i = 0; i < n; i++) {string row = string(n, '.');row[queens[i]] = 'Q';board.push_back(row);}return board;}
};
  • 时间复杂度:O(N!),其中 N 是皇后数量
  • 空间复杂度:O(N),其中 N 是皇后数量。空间复杂度主要取决于递归调用层数、记录每行放置的皇后的列下标的数组以及三个集合,递归调用层数不会超过 N,数组的长度为 N,每个集合的元素个数都不会超过 N

相关文章:

LeetCode——51. N 皇后

一、题目 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案…...

jQuery基本操作

学习目标&#xff1a; 会使用基本选择器获取元素 会使用层次选择器获取元素 会使用属性选择器获取元素 会使用过滤选择器获取元素 学习内容&#xff1a; 1.回顾jQuery语法结构 语法 $(selector).action; 工厂函数$()&#xff1a;将DOM对象转化为jQuery对象。 选择器 sele…...

基于蜣螂算法优化Kmeans图像分割-附代码

基于蜣螂优化Kmeans图像分割算法 - 附代码 文章目录基于蜣螂优化Kmeans图像分割算法 - 附代码1.Kmeans原理2.基于蜣螂算法的Kmeans聚类3.算法实验结果4.Matlab代码摘要&#xff1a;基于蜣螂优化Kmeans图像分割算法。1.Kmeans原理 K-Means算法是一种无监督分类算法&#xff0c;…...

第二章 Kafka设计原理详解

第二章 Kafka设计原理详解 1、Kafka核心总控制器Controller 在 Kafka 集群中会有一个或者多个 broker&#xff0c;其中有一个 broker 会被选举为控制器&#xff08;Kafka Controller&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。 当某个分区的 leader…...

《NFL橄榄球》:费城老鹰·橄榄1号位

费城老鹰&#xff08;英语&#xff1a;Philadelphia Eagles&#xff09;是美国橄榄球联盟在宾夕法尼亚州费城的一支球队。1933年在国家橄榄球联盟扩编时与匹兹堡钢人和辛辛那提红人一起加入&#xff1b;1943年赛季因二次大战的缘故&#xff0c;和匹兹堡钢人作短暂的合并。 在20…...

【人工智能AI】四、NoSQL进阶《NoSQL 企业级基础入门与进阶实战》

帮我写一篇介绍NoSQL的技术文章&#xff0c;文章的标题是《四、NoSQL进阶》&#xff0c;不少于3000字。帮我细化到三级目录&#xff0c;使用markdown格式。这篇文章的目录是&#xff1a; 四、NoSQL 进阶 4.1 NoSQL 高可用 4.2 NoSQL 数据安全 4.3 NoSQL 性能优化 4.4 总结 四、…...

K8S 部署 Jenkins

本文使用 bitnami 镜像部署 Jenkins 官方文档&#xff1a;https://github.com/bitnami/charts/tree/main/bitnami/jenkins 添加 bitnami 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami自定义 values.yaml storageClass&#xff1a;集群的存储类&#xff…...

【人工智能AI】五、NoSQL 应用实践《NoSQL 企业级基础入门与进阶实战》

帮我写一篇介绍NoSQL的技术文章&#xff0c;文章的标题是《五、NoSQL 应用实践》&#xff0c;不少于3000字。目录需要细化到三级目录&#xff0c;使用markdown格式。这篇文章的大的目录是&#xff1a; 五、NoSQL 应用实践 5.1 NoSQL 实时数据分析 5.2 NoSQL 分布式系统 5.3 NoS…...

Java爬虫系列 - 爬虫补充内容+ElasticSearch展示数据

一&#xff0c;定时任务Cron表达式Component public class TaskTest {Scheduled(cron "0/5 * * * * *") // 从0秒开始&#xff0c;每个五秒 执行一次 { 秒 分 时 天 月 周 }public void test(){System.out.println("定时任务执行了");} }二&#xff0c;网…...

Typora常用快捷键

Typora常用快捷键大全 ctrl1到6&#xff1a;1~6级标题&#xff0c;标题用ctrlH是没用的 ctrlshiftk&#xff1a;随时随地插入代码块&#xff0c;极为方便。 ctrlt&#xff1a;创建表格&#xff0c;也可直接输入|列1|列2|列3|并回车来创建表 ctrlshiftq&#xff1a;能实现添加…...

开学季好用电容笔有哪些?好用实惠的电容笔推荐

随着科学技术的快速发展&#xff0c;ipad的影响力越来越大&#xff0c;而且ipad的用户也越来越多&#xff0c;如果要提高ipad的功能&#xff0c;让ipad更加有趣&#xff0c;那么就需要一款非常适合自己&#xff0c;并且非常实用的电容笔。那么&#xff0c;究竟该选择哪个品牌的…...

C++_复习Recording

文章目录C复习课填空题编程题C复习课 试卷说明&#xff1a; 题型&#xff1a; 填空 编程题目 填空题 构造函数无返回类型&#xff0c;与类名同名; 复制构造函数用于创建对象&#xff0c;形实参结合&#xff0c;返回和接收对象。 补充&#xff1a; 只有在声明语句中使用一个变…...

【java】Spring Cloud --Spring Cloud 的核心组件

文章目录前言一、Eureka&#xff08;注册中心&#xff09;二、Zuul&#xff08;服务网关&#xff09;三、 Ribbon&#xff08;负载均衡&#xff09;四、Hystrix&#xff08;熔断保护器&#xff09;五、 Feign&#xff08;REST转换器&#xff09;六、 Config&#xff08;分布式配…...

【C++】RBTree——红黑树

文章目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树的插入五、代码实现一、红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上…...

【5G RRC】5G系统消息SIB2介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

自托管提醒平台Noted Reminders

什么是 Noted Reminders ? Noted 是一个简单的自托管应用程序&#xff0c;用于创建使用 Apprise API 推送到设备的提醒。您可以向几乎每个平台发送消息&#xff0c;包括定时电子邮件&#xff01; 什么是 Apprise API &#xff1f; Apprise 允许您向我们今天可用的几乎所有最流…...

LockSupport常用方法源码分析

前言&#xff1a;本文将介绍LockSupport类中的方法和部分源码&#xff0c;以及面试常问到的一个小问题&#xff0c;感兴趣的大佬可以指点下。 希望能够加深自己的印象以及帮助到其他的小伙伴儿们&#x1f609;&#x1f609;。 如果文章有什么需要改进的地方还请大佬不吝赐教&am…...

Mybatis Notes

文章目录1 Mybatis 介绍1.1 快速入门2 JDBC2.1 JDBC介绍2.3 JDBC问题分析2.4 Mybatis与JDBC技术对比3 数据库连接池3.1 数据库连接池介绍3.2 数据库连接池产品产品3.3 Druid引入项目4lombok4.1 lombok介绍4.2 lombok使用4.2.1 在pom.xml文件中引入依赖4.2.2 pojo类代码引入1 My…...

MySQL 10:MySQL事务

MySQL 中的事务是由存储引擎实现的。在 MySQL 中&#xff0c;只有 InnoDB 存储引擎支持事务。事务处理可用于维护数据库的完整性&#xff0c;确保批处理的 SQL 语句要么执行要么根本不执行。事务用于管理 DDL、DML 和 DCL 操作&#xff0c;例如插入、更新和删除语句&#xff0c…...

软件设计(十三)-原码、反码、补码、移码

软件设计&#xff08;十二&#xff09;数据结构(下)https://blog.csdn.net/ke1ying/article/details/129035300 下面把一个数转成二进制表达形式 原码&#xff1a; 数值1 &#xff1a; 0000 0001 数值-1 &#xff1a; 1000 0001 1 (- 1) &#xff1a; 1000 0010 这是8个…...

龙迅LT9211D芯片解析:如何实现MIPI与双端口LVDS的高效转换

1. 龙迅LT9211D芯片的核心价值 第一次接触龙迅LT9211D芯片是在一个车载显示项目上&#xff0c;当时客户要求实现4K视频从主控芯片到双屏显示的无损传输。这个看似简单的需求背后&#xff0c;其实隐藏着MIPI和LVDS两种信号标准的转换难题。LT9211D的出现完美解决了这个问题&…...

Windows环境下SeaweedFS的快速部署与实战指南

1. 五分钟搞定SeaweedFS Windows安装 第一次听说SeaweedFS时&#xff0c;我也被这个"海草文件系统"的名字逗笑了。但别被名字迷惑&#xff0c;它可是个正经的分布式文件存储系统&#xff0c;特别适合处理海量小文件。我在Windows上部署过好几次&#xff0c;发现比想象…...

微服务七大核心组件详解:搞懂架构运行底层逻辑

从实战视角拆解微服务架构的"五脏六腑"&#xff0c;掌握每个组件的设计哲学与落地细节一、为什么需要这七大组件&#xff1f; 微服务架构的本质是分布式系统的工程化实践。当单体应用拆分为数十个甚至上百个独立服务后&#xff0c;我们面临的核心挑战&#xff1a;挑战…...

电赛赛题深度解析:从五大类别到实战备赛策略

1. 电赛赛题五大类别全解析 全国大学生电子设计竞赛&#xff08;简称电赛&#xff09;作为电子类专业最具影响力的赛事&#xff0c;其赛题设置直接反映了行业技术发展趋势。经过对近十年赛题的统计分析&#xff0c;所有题目可明确划分为五大类别&#xff0c;每类都有独特的考察…...

C#并行编程进阶:除了Task和Parallel,你还需要学会用PerformanceCounter做资源熔断

C#并行编程中的资源熔断机制&#xff1a;用PerformanceCounter构建自适应系统 当你在深夜部署一个高负载数据处理服务时&#xff0c;最可怕的不是代码报错——而是系统在默默崩溃。我曾经历过这样的时刻&#xff1a;一个看似完美的并行处理管道&#xff0c;在凌晨三点突然吞噬了…...

Atlas 800I A2实战:5小时搞定DeepSeek V3 W4A8量化全流程(含显存优化技巧)

Atlas 800I A2实战&#xff1a;5小时搞定DeepSeek V3 W4A8量化全流程&#xff08;含显存优化技巧&#xff09; 在AI模型部署领域&#xff0c;量化技术正成为突破硬件限制的关键手段。当我们面对Atlas 800I A2这样的高性能服务器时&#xff0c;如何充分发挥其64GB显存优势&#…...

保姆级教程:用CAPL脚本在CANalyzer里离线计算电池Ah积分(附完整代码)

从零实现CANalyzer电池容量离线分析&#xff1a;CAPL脚本开发实战指南 在新能源汽车和储能系统的开发测试中&#xff0c;电池容量(Ah)的精确计算是评估电池性能的核心指标之一。对于刚接触CAN总线分析的工程师来说&#xff0c;如何在CANalyzer环境中搭建完整的离线分析流程&…...

ALOHA开源双臂机器人系统全攻略:从核心价值到深度实践

ALOHA开源双臂机器人系统全攻略&#xff1a;从核心价值到深度实践 【免费下载链接】aloha 项目地址: https://gitcode.com/gh_mirrors/al/aloha 一、探索ALOHA&#xff1a;重新定义低成本双手机器人开发 什么是ALOHA系统 ALOHA&#xff08;A Low-cost Open-source Ha…...

告别阻塞!用 PHP TrueAsync 实现 PHP 脚本提速 10 倍

proc_open 与 shell_exec 等函数不同&#xff0c;proc_open 是创建进程的丰富工具。PHP 核心甚至为它引入了特殊的"hack"来正确处理管道。管道是进程间通信的最佳方式之一&#xff0c;也是最便捷的方式。唯一更好的方案是共享内存加文件事件&#xff0c;这仅仅是因为…...

深入理解 Firebase onSnapshot 的监听机制

前言 在现代 Web 应用开发中,Firebase Firestore 提供了强大的实时数据库功能,onSnapshot 监听器是其中一个关键特性。然而,如何正确地使用这个监听器来处理网络连接失败等特殊情况,往往是开发者需要深入理解的。今天我们将探讨 onSnapshot 的工作机制,并通过实例展示如何…...