【回溯】Leetcode 51. N 皇后【困难】

N 皇后

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

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

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

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

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

解题思路

  • 1、使用回溯算法来生成所有不同的N皇后问题的解决方案。
  • 2、在每一行中,依次尝试放置皇后,并检查是否符合规则,即不在同一行、同一列、同一对角线上。
  • 3、使用递归回溯的方法,尝试放置皇后,并继续向下一行递归放置。
  • 4、如果当前行放置皇后后,无法找到合适的位置,则回溯到上一行重新尝试。

解题步骤

  • 1、初始化棋盘: 创建一个大小为 n×n 的棋盘,用二维数组表示,初始时所有位置都为空(用 ‘.’ 表示)。

  • 2、回溯搜索: 从第一行开始逐行放置皇后,在放置每一行的皇后时, 都需要检查当前位置是否合法。
    如果合法,则将皇后放置在该位置,并继续递归地放置下一行的皇后;
    如果不合法,则尝试下一个位置。在递归的过程中,需要记录已经放置的皇后的位置,以便进行回溯。

  • 3、递归结束条件: 当放置了所有的皇后时,即递归到达了棋盘的最后一行,
    此时找到了一个可行解,将该解保存下来。然后回溯到上一行,尝试放置下一个皇后,继续搜索其他解。

  • 4、合法性检查: 在放置皇后时,需要检查当前位置是否与已放置的皇后冲突。
    具体地,需要检查当前位置的同一列、同一行、左上对角线和右上对角线是否已经存在皇后。 如果存在冲突,则当前位置不合法,需要尝试下一个位置。

  • 5、保存解: 当找到一个合法的解时,将该解保存到结果集中,
    并继续搜索其他可能的解。

  • 6、回溯: 在搜索过程中,如果发现当前位置无法放置皇后,或者已经找到了一个解,
    则需要回溯到上一步,撤销当前操作,尝试其他可能的选择。

  • 7、返回结果: 当搜索结束时,返回所有找到的合法解。

java实现

public class NQueens {public List<List<String>> solveNQueens(int n) {//保存结果集List<List<String>> result = new ArrayList<>();//初始化棋盘char[][] board = new char[n][n];for (int i = 0; i < n; i++) {Arrays.fill(board[i], '.');}//放置皇后backtrack(result, board, 0);return result;}//回溯private void backtrack(List<List<String>> result, char[][] board, int row) {if (row == board.length) {result.add(constructSolution(board));return;}for (int col = 0; col < board.length; col++) {///判断放置位置是否符合规则if (isValid(board, row, col)) {board[row][col] = 'Q';backtrack(result, board, row + 1);//撤销此次产生的影响,回溯到上一步board[row][col] = '.';}}}//判断放置位置是否符合规则private boolean isValid(char[][] board, int row, int col) {for (int i = 0; i < row; i++) {// 检查列是否有皇后冲突if (board[i][col] == 'Q') return false;//获取行的差值,用于下面左上方、右上方对角线对应的位置//对于[row][col]因i= row-d 转换成[i+d,col],所以[i,col-d]一定在其左上方// 随着i从0到row变化,d的值也在改变,d=1,board[i][col - d]就是[row][col]左上方的格子,// d=2,board[i][col - d]就是[row][col]左上方的左上方的格子int d = row - i;// 检查左上方对角线是否有皇后冲突if (col - d >= 0 && board[i][col - d] == 'Q') return false;// 检查右上方对角线是否有皇后冲突if (col + d < board.length && board[i][col + d] == 'Q') return false;}return true;}//记录解决方案private List<String> constructSolution(char[][] board) {List<String> solution = new ArrayList<>();for (char[] row : board) {solution.add(String.valueOf(row));}return solution;}public static void main(String[] args) {NQueens nQueens = new NQueens();List<List<String>> solutions = nQueens.solveNQueens(4);for (List<String> solution : solutions) {for (String row : solution) {System.out.println(row);}System.out.println();}}
}

时间空间复杂度

  • 时间复杂度:O(N!),其中N是棋盘的大小。因为每一行都有N种放置皇后的可能性,总共有N行。

  • 空间复杂度:O(N^2),存储所有可能的棋盘状态。

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

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

相关文章

2024年第十四届MathorCup数学应用挑战赛B题解题思路

B题https://mbd.pub/o/bread/ZZ6Wm5dx 问题1:对于附件I(Pre_test文件夹)给定的三张甲骨文原始拓片图 片进行图像预处理&#xff0c;提取图像特征&#xff0c;建立甲骨文图像预处理模型&#xff0c;实现对 甲骨文图像干扰元素的初步判别和处理。 针对问题1&#xff0c;对于附件…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

Android - 安卓概述

什么是安卓? Android 是一种基于 Linux 的开源操作系统&#xff0c;适用于智能手机和平板电脑等移动设备。 Android 是由 Google 和其他公司领导的 Open Handset Alliance 开发的。 Android 为移动设备的应用程序开发提供了统一的方法&#xff0c;这意味着开发人员只需为 And…

多模块项目使用springboot框架进行业务处理

项目目录 1、在Result定义返回结果 package com.edu.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data public class Result<T> implements Serializable {private Integer code; //编码&#xff1a;1成功&#xf…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(二十五): 聚酰亚胺光敏PI(PSPI)

聚酰亚胺光敏PI&#xff08;PSPI&#xff09; 聚酰亚胺光敏PI&#xff08;PSPI&#xff09;是一种结合了聚酰亚胺&#xff08;PI&#xff09;的优良物理和化学性能以及光敏材料特性的高端有机材料。在高分子链上&#xff0c;它兼有亚胺环和光敏基因&#xff0c;因此具有优异的热…

蓝桥杯 前一晚总结 模板 新手版

《准备实足&#xff0c;冲冲冲 省一》https://www.yuque.com/lenyan-svokd/hi7hp2/hfka297matrtsxy2?singleDoc# 《准备实足&#xff0c;冲冲冲 省一》 #include<bits/stdc.h> // 包含标准库头文件using namespace std; using ll long long; // 定义 long long 数据类…

防火墙操作!

当小编在Linux服务器上部署好程序以后&#xff0c;但是输入URL出现下述情况&#xff0c;原来是防火墙的原因&#xff01;&#xff01; 下面是一些防火墙操作&#xff01; 为保证系统安全&#xff0c;服务器的防火墙不建议关闭&#xff01;&#xff01; 但是&#xff0c;我们可…

免费ssl证书能一直续签吗?如何获取SSL免费证书?

免费SSL证书是否可以一直续签。我们需要了解SSL证书的基本工作原理。当你访问一个使用HTTPS协议的网站时&#xff0c;该网站实际上在使用一个SSL证书。这个证书相当于一个数字身份证明&#xff0c;它验证了网站的真实性和安全性。而这个证明是由受信任的第三方机构——通常是证…

RestTemplate—微服务远程调用—案例解析

简介&#xff1a;总结来说&#xff0c;微服务之间的调用方式有多种&#xff0c;选择哪种方式取决于具体的业务需求、技术栈和架构设计。RESTful API和HTTP客户端是常见的选择&#xff0c;而Feign和Ribbon等辅助库可以简化调用过程。RPC和消息队列适用于特定的场景&#xff0c;如…

kail渗透工具之nmap的使用方法

准备工作&#xff1a;开启两台虚拟机和一台Windows主机 kail Linux攻击机&#xff1a;192.168.80.131 red hat靶机&#xff1a;192.168.80.129 Windows主机&#xff1a;192.168.252.42 1、nmap扫描工具的简介 nmap是用来探测计算机网络上的主机和服务的一种安全扫描器。为了绘…

mysql查找binlog的删除记录时间

需求&#xff1a;数据库某表的数据没有了&#xff1b;如何找是什么时修改清掉的&#xff1b; 思路&#xff1a; 1. 查代码&#xff0c;找某表的删除接口&#xff0c;分析是在哪里调用&#xff1b;【部分服务log不全】 2. 查服务的log&#xff1b;【部分服务log不全】 3. 查…

JRT多平台初始化程序

这么多年客户端一直只做Windows&#xff0c;所以初始化程序用C#写个Exe&#xff0c;按网站生成的下载清单文件一个个下载和部署客户端环境是可以的。新的由于设计目标就是支持多平台的&#xff0c;所以需要重新考虑初始化设计。 介绍和演示视频 设计目标有以下&#xff1a; 1…