leetcode热题HOT 51. N 皇后

一、问题描述:

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

二、解题思路:

1、初始化:代码首先初始化一个 n x n 大小的棋盘 chessboard,并将所有位置都设置为 ‘.’(表示空位置)。

2、递归回溯:使用 backtracking 方法递归地在棋盘上放置皇后。

递归的基础条件是:当已经放置了 n 个皇后 (num == n) 时,将当前棋盘转换成字符串列表并添加到 result 中。
在递归中,循环遍历每一列尝试放置皇后。对于每一列,在当前行放置皇后之前,会先调用 correct 方法检查当前位置是否可以放置皇后(不与之前放置的皇后冲突):
①如果当前位置可以放置皇后,就将皇后放置在棋盘上,然后递归调用 backtracking 继续放置下一个皇后。
②如果递归返回,表示无法继续放置皇后,则回溯,撤销当前行的皇后放置(将棋盘位置设为 ‘.’)。

3、正确性检查:correct() 方法用于检查在 row 行和 col 列是否可以放置皇后。它通过检查同一列、左上对角线和右上对角线是否有其他皇后来判断。

4、结果转换:Array2List() 方法将棋盘的 char[][] 转换为 List 以存储结果。

5、回溯模板:

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

三、代码示例:

class Solution {List<List<String>> result = new ArrayList<>(); // 存储最终结果的列表char[][] chessboard; // 棋盘数组public List<List<String>> solveNQueens(int n) {chessboard = new char[n][n]; // 初始化棋盘for (char[] c : chessboard) {Arrays.fill(c, '.'); // 将棋盘所有位置初始化为空('.'表示空位置)}backtracking(n, 0); // 开始回溯搜索return result; // 返回结果列表}// 回溯搜索方法public void backtracking(int n, int num){if(num == n) result.add(Array2List(chessboard)); // 如果已经放置了n个皇后,将当前棋盘转换成字符串列表并添加到结果中for(int i = 0; i < n; i++){if(correct(num, i, n) == true){chessboard[num][i] = 'Q';backtracking(n, num + 1);//继续搜索下一行chessboard[num][i] = '.';//回溯,返回上一步}}}// 将棋盘数组转换为字符串列表的方法public List Array2List(char[][] chessboard) {List<String> list = new ArrayList<>();for (char[] c : chessboard) {list.add(String.copyValueOf(c)); // 将每一行转换为字符串并添加到列表中}return list;}// 检查当前位置是否可以放置皇后的方法public boolean correct(int row, int col, int n){if(row == 0) return true; // 如果是第一行,直接返回true,因为不会有冲突for(int i = 0; i < row; i++){if(chessboard[i][col] == 'Q') return false; // 检查同一列是否已经有皇后}if(col > 0){for(int i = row, j = col; i >= 0 && j >= 0; i--,j--){if(chessboard[i][j] == 'Q') return false; // 检查左上对角线是否有皇后}}if(col < n - 1){for(int i = row, j = col; i >= 0 && j < n; i--, j++){if(chessboard[i][j] == 'Q') return false; // 检查右上对角线是否有皇后}}return true; // 如果没有冲突,返回true}
}
  • 时间复杂度分析:
    ①回溯搜索:算法通过回溯搜索尝试所有可能的皇后放置方案。每个皇后都可以放置在一行的某一列上,因此最坏情况下是 n^n 的方案数(尽管实际上远远小于这个数)。
    ②冲突检查:在 correct 方法中,检查是否有冲突的操作花费了 O(n) 的时间复杂度。
    总体上,该算法的时间复杂度估计为 O(n!),因为它试图在棋盘上放置 n 个皇后,每个皇后在不同行尝试不同列的位置。而每一个选择可能会导致回溯,因此每次递归都可能产生 n! 个可能的放置方案。这是一个非常复杂的问题,因为时间复杂度会随着 n 的增加快速增长。

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

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

相关文章

python——字典(dict)

概念 字典里面的数据是以键值对形式出现&#xff0c;字典数据和数据顺序没有关系。 语法 数据为键值对形式出现&#xff0c;各个键值对之间用逗号隔开 d dict() d1 {"name":"zhanghao","age":12}方法 #mermaid-svg-nk6Q3uUsDPRNAJ0s {font…

SpringBoot基于RabbitMQ实现消息延迟队列方案

知识小科普 在此之前&#xff0c;简单说明下基于RabbitMQ实现延时队列的相关知识及说明下延时队列的使用场景。 延时队列使用场景 在很多的业务场景中&#xff0c;延时队列可以实现很多功能&#xff0c;此类业务中&#xff0c;一般上是非实时的&#xff0c;需要延迟处理的&a…

ipsec的特点和优点

IPsec&#xff08;Internet Protocol Security&#xff09;是一种用于保护 IP 网络通信安全的协议套件&#xff0c;它具有许多特点和优点&#xff0c;包括&#xff1a; 加密通信&#xff1a; IPsec 提供了对 IP 数据包的加密功能&#xff0c;可以确保数据在传输过程中是加密的…

Opencv | Opencv 基于图像的运算

目录 一. OpenCV 基于图像的运算1 cv.item( ) 获取图像某个位置的像素值2. cv. itemset( ) 修改图像某个位置的像素值3. cv.split( ) / cv.merge( ) 通道的分割与合并4. cv.copyMakeBorder ( ) 添加边框5. cv.addWeighted ( ) 图像融合 / 权重和6. cv.threshold 二值化操作7. c…

webpack详解

前端对于打包工具webpack的使用 首先是针对于版本的变化3-4 4的话node版本的底版不再支持,尽量下载14.0以后的版本,做到更好的兼容 配置方面增加了mode:production/development/none想要指定在不同的mode下开启默认的优化手段 loader和plugin的不同 1.loader能让webpack…

高防IP的优势和挑战

高防IP&#xff08;防御性网络IP&#xff09;是一种具有强大防御能力的网络服务&#xff0c;在面对网络攻击时能够保护系统免受攻击的影响。以下是高防IP的优势和挑战的例子&#xff1a; 优势&#xff1a; 强大的防御能力&#xff1a;高防IP能够识别和过滤掉各种类型的网络攻击…

【深入探讨】JavaScript 中的 forEach 和 map 区别

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端Clodplay &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨优质专栏&#xff1a;VS Code插件开…

房贷还款(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double m, r 0.01;float d 300000;float p 6000;//运算还款所需月份&#xff1b;m log10…

元象4.2B参数 MoE大模型实战

01 简介 近期&#xff0c;元象公司推出了其首个Moe大模型XVERSE-MoE-A4.2B。该模型采用了混合专家模型架构&#xff08;Mixture of Experts&#xff09;&#xff0c;并拥有4.2B的激活参数&#xff0c;其性能可与13B模型相媲美。值得一提的是&#xff0c;这个模型是完全开源的&…

Python 实战人工智能数学基础:图像处理应用

1.背景介绍 在许多计算机视觉任务中&#xff0c;图像处理占据了很重要的角色&#xff0c;尤其是在目标检测、特征提取、分类、跟踪等计算机视觉任务中。图像处理是一个复杂的过程&#xff0c;涉及到图像的采集、分析、存储、显示等环节。本文将讨论基于Python实现的图像处理的…

spring快速搭建聊天AI

官网url: https://spring.io/projects/spring-ai 本文演示的是open AI 1创建java项目 2.拿到AI的key&#xff08;没有的话可以去淘宝花几块钱买一个&#xff09; //YOUR_API_KEY写你自己的open AI的key spring.ai.openai.api-keyYOUR_API_KEY spring.ai.openai.chat.options.…

在家如何查找下载外文文献

查找下载外文文献的数据库大部分都需要使用权限的&#xff0c;那么我们如何在家进入这些数据库查找下载文献资源呢&#xff1f;请看本文的经验分享&#xff1a; 举例1、 一位同学的文献求助&#xff1a;Performance of financial hedging and earnings management under dive…

计算机笔记(10)续20个

160.BCD码一共有十位编码 161.物联网两个重要因素&#xff1a;规模性&#xff0c;流动性 162.需求分析的任务包括&#xff1a;问题分析&#xff0c;需求描述&#xff0c;需求评审 163.非法破译他人的密码破坏了数据的保密性 164.一级汉字3755个&#xff0c;二级3008个 165…

利用python写java项目(springboot+vue)的代码生成工具,vue+springboot项目加字段神器

经常会遇到项目需要加字段的事情&#xff0c;一个两个也就那么样&#xff0c;多了就比较烦。虽然框架里自带代码生成工具&#xff0c;脚手架基本上都有&#xff0c;但是&#xff0c;有时候需要改字段&#xff0c;加字段&#xff0c;数量还比较多的时候&#xff0c;再生成一次很…

WordPress 图片压缩插件:Compress JPEG PNG images 使用方法

插件介绍 Compress JPEG & PNG images是一款非常好用的图片压缩插件:&#xff0c;非常值得大家安装使用&#xff1b;特别是图片类型网站。其实我们很多服务器磁盘空间是不在乎多那么几十 MB 大小的&#xff0c;但是压缩了图片能提升网站速度&#xff0c;节省宽带&#xff…

【论文阅读——SplitFed: When Federated Learning Meets Split Learning】

级别CCFA 1.摘要 联邦学习&#xff08;FL&#xff09;和分割学习&#xff08;SL&#xff09;是两种流行的分布式机器学习方法。两者都采用了模型对数据的场景&#xff1b;客户端在不共享原始数据的情况下训练和测试机器学习模型。由于机器学习模型的架构在客户端和服务器之间…

(最新)itext7 freemarker动态模板转pdf

1.引入依赖 <!--PDF导出POM--> <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>8.0.3</version><type>pom</type> </dependency> <dependency><grou…

BackTrader 中文文档(七)

原文&#xff1a;www.backtrader.com/ TA-Lib 原文&#xff1a;www.backtrader.com/docu/talib/talib/ 即使backtrader提供了大量内置指标&#xff0c;而且开发指标主要是定义输入、输出并以自然方式编写公式&#xff0c;一些人还是想要使用TA-LIB。一些原因包括&#xff1a; 指…

基于SignalR视频聊天 一

环境 VS2022 WIN10 .NET8 VSCode VUE SignalR 1.安装SignalR客户端库 需要在Vue.js项目中安装SignalR客户端库。可以使用npm或者yarn来安装 npm install microsoft/signalr2.创建SignalR服务 创建SignalR服务&#xff0c;以便客户端&#xff08;Vue.js应用&#xff09;能…

抄袭可耻 - 2023面试高手抄袭对比图

原创博客(伏城之外)抄袭博客(2023面试高手)对比图华为OD机试 - 跳马(Java & JS & Python & C & C++)_华为od岗c卷机试马走日-CSDN博客2024年华为OD机试真题-跳马-Python-OD统一考试(C卷)-CSDN博客