Leetcode刷题详解——N 皇后

1. 题目链接:51. N 皇后

2. 题目描述:

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

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

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

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

示例 1:

img

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

示例 2:

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

提示:

  • 1 <= n <= 9

3. 解法(递归):

3.1 算法思路:

首先我们在第一行放置第一个皇后,然后遍历棋盘的第二行,在可行的位置放置第二个皇后后,然后再遍历第三行,在可行的位置放置第三个皇后,以此类推,直到放置了n个皇后为止

我们需要用一个数组来记录每一行放置的皇后的列数。在每一行中,我们尝试放置了一个皇后,并检查是否和前面已经放置的皇后冲突。如果没有冲突,我们就继续递归地放置下一行的皇后,直到所有的皇后都放置完毕,然后把这个方案记录下来

在检查皇后是否冲突时,我们可以用一个数组来记录每一列是否已经放置了皇后,并检查当前要放置的皇后是否会和已经放置的皇后冲突。对于对角线,我们可以用两个数组来记录从左上角到右下角的每一条对角线上是否已经放置了皇后,以及右上角到左下角的每一条对角线上是否已经放置了皇后

对于对角线是否冲突的判断可以通过以下流程解决:

  1. 从左上到右下:相同对角线的行列之差相同
  2. 从右上到左下:相同对角线的行列之和相同

3.2 递归函数流程:

  1. 结束条件:如果row等于n,则表示已经找到一组解法方案,此时将每个皇后的位置存储到字符串数组path中,并将path存储到ret数组中,然后返回
  2. 枚举当前行的每一列,判断该列、两个对角线上是否已经有皇后:
    1. 如果有皇后,则继续枚举下一列
    2. 否则,在位置放置皇后,并将checkColcheckDig1checkDig2对应的位置设置为false,然后继续枚举下一列

请添加图片描述

3.3 C++算法代码:

class Solution {
    bool checkCol[10],checkDig1[20],checkDig2[20]; // 用于检查列、对角线1和对角线2是否被皇后占据的数组
    vector<vector<string>> ret; // 存储所有解的二维向量
    vector<string> path; // 当前解的路径
    int n; // 棋盘大小
public:
    vector<vector<string>> solveNQueens(int _n) 
    {
        n=_n; // 初始化棋盘大小
        path.resize(n); // 初始化路径
        for(int i=0;i<n;i++) // 初始化路径为全'.'
        {
            path[i].append(n,'.');
        }
        dfs(0); // 从第0行开始搜索
        return ret; // 返回所有解
    }
    void dfs(int row) // 深度优先搜索函数,row表示当前搜索到的行数
    {
        if(row==n) // 如果已经搜索到最后一行,说明找到了一个解
        {
            ret.push_back(path); // 将当前解添加到结果中
            return;
        }
        for(int col=0;col<n;col++) // 遍历当前行的每个位置
        {
            if(!checkCol[col]&&!checkDig1[row-col+n]&&!checkDig2[row+col]) // 如果该位置没有被皇后占据且不在任何一条对角线上
            {
                path[row][col]='Q'; // 放置皇后
                checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col]=true; // 标记该位置已被皇后占据
                dfs(row+1); // 继续搜索下一行
                path[row][col]='.'; // 回溯,移除皇后
                checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col]=false; // 标记该位置未被皇后占据
            }
        }
    }
};

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

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

相关文章

qml编译多语言

qml编译多语言 windows下转换将qml需要转换内容提取转为.ts文件将.ts文件转换为.qm文件.qm文件可以用QTranslator::load进行使用 windows下转换 打开QT自带的 MinGW 控制台 将qml需要转换内容提取转为.ts文件 qml转换字段内容需要qsTr() 将qml转为 filename.ts 文件 转到程序…

电脑怎么录制视频,录制的视频怎么剪辑?

在现今数字化的时代&#xff0c;视频成为了人们日常生活中不可或缺的一部分。因此&#xff0c;对于一些需要制作视频教程、录制游戏或者是进行视频演示的人来说&#xff0c;电脑录屏已经成为了一个必不可少的工具。那么&#xff0c;对于这些人来说&#xff0c;如何选择一个好用…

Hikyuu 1.3.0 发布,高性能量化交易研究框架

Hikyuu 是一款基于 C/Python 的高性能开源量化交易研究框架&#xff0c;用于快速策略分析及回测。与其他量化平台或回测软件相比&#xff0c;具备&#xff1a; 超快的回测速度&#xff1b;对完整的系统交易理念进行抽象&#xff0c;并分解为不同的组件&#xff0c;通过重用不同…

C# Dictionary与List的用法区别与联系

C#是一门广泛应用于软件开发的编程语言&#xff0c;其中Dictionary和List是两种常用的集合类型。它们在存储和操作数据时有着不同的特点和用途。本文将详细探讨C# Dictionary和List的用法区别与联系&#xff0c;并通过代码示例进行对比&#xff0c;以帮助读者更好地选择适合自己…

React进阶之路(四)-- React-router-v6、Mobx

文章目录 ReactRouter前置基本使用核心内置组件说明编程式导航路由传参嵌套路由默认二级路由404路由配置集中式路由配置 Mobx什么是Mobx环境配置基础使用计算属性&#xff08;衍生状态&#xff09;异步数据处理模块化多组件数据共享 ReactRouter 前置 在一开始前端开发都是单…

电力输送、材料和互连领域即将发生巨大变化

在设备互连方面&#xff0c;铜无可匹敌。其低电阻率和高可靠性为业界提供了出色的片上互连和芯片间连线服务。但在逻辑芯片中&#xff0c;随着互连堆栈上升到14级范围&#xff0c;并且阻容(RC)延迟在总延迟中所占的比例越来越大&#xff0c;晶圆厂正在寻求替代金属来维持性能。…

使用ffmpeg 压缩视频

我有一批1080p的视频,在网上播放占用空间太大,需要进行压缩以后再上传,下面是记录一下ffmpeg命令的使用情况 原视频大小:288mb --压缩加修改分辨率 640p ffmpeg -y -i C4995.mp4 -vcodec libx264 -crf 18 -s vga C4995\C4995_2.MP4 -y: 强制覆盖 -i :输入文件 -vcodec lib…

vue3+antv2.x的画布

报错信息&#xff1a; TypeError: Cannot destructure property component of registry_1.shapeMaps[node.shape] as it is undefined. at VueShapeView.renderVueComponent (http://192.168.10.35:9029/node_modules/.vite/deps/antv_x6-vue-shape.js?v49fbfab0:5569:19…

(动手学习深度学习)第7章 批量规范化(Batch Normalization)

BN 总结 批量归一化固定小批量中的均值和方差&#xff0c;然后学习出适合的偏移和缩放。可以加速收敛速度&#xff0c;但一般不改变模型精度。 BN代码手动实现 导入相关库 import torch from torch import nn from d2l import torch as d2l定义BN层 def batch_norm(X, gam…

【FGPA】Verilog:移位寄存器 | 环形计数器 | 4bit移位寄存器的实现 | 4bit环形计数器的实现

目录 Ⅰ. 理论部分 0x00 移位寄存器&#xff08;Shift Register&#xff09; 0x01 环形计数器&#xff08;Ring Counter&#xff09; Ⅱ. 实践部分 0x00 移位寄存器&#xff08;4-bit&#xff09; 0x01 四位环形寄存器&#xff08;4-bit&#xff09; Ⅰ. 理论部分 0x00 …

如何在3dMax中使用MaxScript在视口中显示数据?

如何在3dMax中使用MaxScript在视口中显示数据&#xff1f; 详细的教程指南&#xff0c;介绍如何使用MaxScript在视口中直接显示对象名称、坐标和顶点索引等信息。 在本教程中&#xff0c;您将学习如何借助MaxScript在视口中直接显示对象信息或数据。 本教程介绍了如何显示简单的…

LeetCode算法题解(回溯、难点)|LeetCode51. N 皇后

LeetCode51. N 皇后 题目链接&#xff1a;51. N 皇后 题目描述&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。…

[PyTorch][chapter 61][强化学习-免模型学习 off-policy]

前言&#xff1a; 蒙特卡罗的学习基本流程&#xff1a; Policy Evaluation : 生成动作-状态轨迹,完成价值函数的估计。 Policy Improvement: 通过价值函数估计来优化policy。 同策略&#xff08;one-policy&#xff09;&#xff1a;产生 采样轨迹的策略 和要改…

【K8s集群离线安装-kubeadm】

1、kubeadm概述 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令快速完成一个kubernetes集群的部署。 2、环境准备 2.1 软件环境 软件版本操作系统CentOS 7Docker19.03.13K8s1.23 2.2 服务器 最小硬件配置&#xff1a;2核CPU、2G内存…

19.5 Boost Asio 传输结构体

同步模式下的结构体传输与原生套接字实现方式完全一致&#xff0c;读者需要注意的是在接收参数是应该使用socket.read_some函数读取&#xff0c;发送参数则使用socket.write_some函数实现&#xff0c;对于套接字的解析同样使用强制指针转换的方法。 服务端代码如下所示 #incl…

「Verilog学习笔记」4位数值比较器电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 这里要注意题目的“门级描述方式”&#xff0c;所以我们只能使用基本门电路&#xff1a;&,|,!,^,^~。 具体实现思路&#xff1a;通过真值表得出Y0 Y1 Y2的逻辑表达…

Vue3使用vue-print-nb插件打印功能

插件官网地址https://www.npmjs.com/package/vue-print-nb 效果展示: 打印效果 根据不同的Vue版本安装插件 //Vue2.0版本安装方法 npm install vue-print-nb --save pnpm install vue-print-nb --save yarn add vue-print-nb//Vue3.0版本安装方法&#xff1a; npm install vue3…

优思学院|CTP和CTQ是什么?有什么区别?

CTQ 关键质量特性 CTQ是在六西格玛管理中常用的重要词汇&#xff0c;所以很多不同界别的人仕都可能听过&#xff0c;CTQ的意思是关键质量特性&#xff0c;Critical To Quality 的缩写。 六西格玛管理提倡的方法是通过客户的声音 (Voice of customer-VOC) &#xff0c;然后把它…

绝对力作:解锁string的所有关键接口,万字深度解析!

W...Y的主页 &#x1f60a; &#x1f354;前言&#xff1a; 通过博主的上篇文章&#xff0c;我相信大家已经认识了STL并且已经迫不及待想学习了&#xff0c;现在我们就走近STL的第一种类——string。 目录 为什么学习string类&#xff1f; C语言中的字符串 标准库中的str…

使用 Socks5 来劫持 HTTPS(TCP-TLS) 之旅

MITM 劫持的过程中&#xff0c;HTTP 协议并不是唯一选择。 实际在 MITM 使用过程中&#xff0c;BurpSuite 和 Yakit 提供的交互式劫持工具只能劫持 HTTP 代理的 TLS 流量&#xff1b;但是这样是不够的&#xff0c;有时候我们并不能确保 HTTP 代理一定生效&#xff0c;或者说特…