leetcode 困难 —— N 皇后(简单递归)

news2025/5/30 14:47:14

(不知道为啥总是给这种简单的递归设为困难题,虽然优化部分很不错,但是题目太好过了)

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

题解:
首先看眼数据范围,1 <= n <= 9,这么小的数据,估计就是枚举了

那我们怎么枚举呢,遍历在前 i 行已经确定的情况下,第 i + 1 行所有可取的情况
(第 0 行则每一列所有都可取)

那我们怎么判断可不可取呢
① 该列和以前行的列重合
② 该列和以前行的列在一条斜线上(当前行 - 以前行 = | 当前列 - 以前列 |)

然后我们把以前的行的选择列,用一个字符串表示即可
例 “13524”,第一行选第一列,第二行选第三列…

代码如下:

class Solution {
public:
    vector<string> solve(string pre, int n) {
        vector<string> res;
        bool flag[10];
        for(int i = 0; i < n; i++) {
            flag[i] = true;
        }
        int m = pre.size();
        for(int i = 0; i < m; i++) {
            flag[pre[i] - '0'] = false;
            if(pre[i] - '0' - m + i >= 0) flag[pre[i] - '0' - m + i] = false;
            if(pre[i] - '0' + m - i < n) flag[pre[i] - '0' + m - i] = false;
        }
        vector<string> temp;
        for(int i = 0; i < n; i++) {
            if(flag[i] && m != n - 1) {
                temp = solve(pre + char(i + '0'), n);
                res.insert(res.end(), temp.begin(), temp.end());
            }
            else if(flag[i] && m == n - 1) {
                res.push_back(pre + char(i + '0'));
            }
        }
        return res;
    }
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string> > res;
        vector<string> t = solve("", n);
        for(int i = 0; i < t.size(); i++) {
            vector<string> temp;
            for(int j = 0; j < n; j++) {
                string str = "";
                for(int k = 0; k < n; k++) {
                    if(k != t[i][j] - '0') {
                        str = str + '.';
                    }
                    else {
                        str = str + 'Q';
                    }
                }
                temp.push_back(str);
            }
            res.push_back(temp);
        }
        return res;
    }
};

接下来,我们考虑优化

在这里插入图片描述

有没有觉得,这个很像二进制的位移

我们用三个二进制数字分别表示,在左斜线上的,在右斜线上的,在一条直线上的
每一个二进制数字都是表示当前行的状态

接下来每过一行,我们二进制位移一次即可(表示直线上的不用二进制位移)
这样空间和时间复杂度都降低了

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

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

相关文章

2023年信息与通信工程国际会议(JCICE 2023)

2023年信息与通信工程国际会议(JCICE 2023) 重要信息 会议网址&#xff1a;www.jcice.org 会议时间&#xff1a;2023年3月17-19日 召开地点&#xff1a;成都 截稿时间&#xff1a;2023年2月10日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,Scopus 会议简介…

干货 | 机器人的运动规划方法和应用现状

“如今&#xff0c;机器人正在更深入的服务于人类&#xff0c;它们要想完成的一些力所能及的操作&#xff0c;都需要依托于机器人的运动规划。本期技术干货&#xff0c;我们邀请到了小米工程师——‍孙国康&#xff0c;向我们介绍机器人的运动规划方法和应用现状。”一、前言近…

C++ 浅谈之 STL Deque

C 浅谈之 STL Deque HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是 C 浅谈系列&#xff0c;收录在专栏 C 语言中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些 C 语言重要的语法特性 &#x1f3c3;&a…

舆情监测方案怎么写,TOOM舆情监测系统解决方案

舆情监测是通过网络和媒体来收集、分析、评估和报告关于某一特定话题或组织的舆论动态的过程。舆情监测方案通常包括数据收集、数据分析、报告生成等步骤&#xff0c;以帮助组织了解公众对其的看法和声音&#xff0c;并以此作出相应的决策和行动&#xff0c;舆情监测方案怎么写…

车道线检测-Eigenlanes 论文学习笔记

论文&#xff1a;《Eigenlanes: Data-Driven Lane Descriptors for Structurally Diverse Lanes》 代码&#xff1a;https://github.com/dongkwonjin/Eigenlanes 核心&#xff1a;在 Eigenlane Space 中检测车道线 创新点 Eigenlane&#xff1a;数据驱动的车道描述符&#xff…

Python中__init__.py文件深入理解

Python中文件__init__.py深入理解1. 简介1.1 模块&#xff08;Module&#xff09;和包&#xff08;Package&#xff09;的概念1.2 __init__.py文件简介2. __init__.py内容写法2.1 __init__.py文件内容2.2 __init__.py内容解释1. 简介 1.1 模块&#xff08;Module&#xff09;和…

这是从零在独自开开发,将是副业赚钱最好的平台!

文章目录最重要的事情放前面1.前言2.简单介绍一下3.【独自开】介绍3.1 分层标准化平台架构3.2 集成第三方数字接口3.3 支持各个行业的系统定制开发4.如何在【独自开】赚钱获取收益?4.1 如何称为【独自开】开发者?最重要的事情放前面 通过平台的审核也可以得到相应的奖金&…

信息系统建设和服务能力等级证书(CS)

2019年11月26日&#xff0c;中国电子信息行业联合会发布了《信息系统建设和服务 能力评估体系 能力要求》&#xff08;简称《能力要求》&#xff09;。《能力要求》是我国信息系统建设和服务能力领域的首个团体标准&#xff0c;旨在通过该标准的实施提升信息系统建设和服务行业…

Linux学习之冯诺依曼体系结构

目录冯诺伊曼结构体系基本概念冯诺依曼结构分为五个部分组成冯诺依曼结构体系的各部分的读写特点&#xff1a;从软件数据上认识冯诺依曼结构体系冯诺伊曼结构体系 基本概念 数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机…

JVM相关面试题

文章目录说一下 JVM 的主要组成部分及其作用&#xff1f;说一下 JVM 运行时数据区 &#xff1f;JVM中哪些是线程共享区 &#xff1f;说一下堆栈的区别&#xff1f;队列和栈是什么&#xff1f;有什么区别&#xff1f;简述Java类加载机制?说一下类装载的执行过程&#xff1f;什么…

类的 6 个默认成员函数

文章目录一、构造函数1. 构造函数的定义2. 编译器生成的构造函数3. 默认构造函数4. 初始化列表5. 内置成员变量指定缺省值(C11)二、析构函数1. 析构函数的定义2. 编译器生成的析构函数3. 自己写的析构函数的执行方式三、拷贝构造函数1. C语言值传递和返回值时存在 bug2. 拷贝构…

2023上半年软考中级报名-系统集成项目管理工程师

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

【Hello Linux】 Linux基础命令(持续更新中)

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux基础命令ls指令lsls -als -dls -ils -sls -lls -nls -Fls -rls -tls -Rls -1总结思维导图pwd指令whoami指令…

已解决:pywintypes.com_error: (-2147221005, ‘无效的类字符串‘, None, None)

今天接到一个需求&#xff0c;就是读取doc文件&#xff0c; 注意是doc! doc! doc&#xff0c; 不是docx! 不是docx! 不是docx! 以下的博客都是挂羊头&#xff0c;卖狗肉 但是好多博客都是读取docx&#xff0c;以次来博取流量与眼球&#xff0c;还有好多我都用不了&#xff0…

做产品时有哪些常见的错误认知?

作为产品新人最容易遗漏的就是一些小的细节&#xff0c;有时候可能脑子里想过&#xff0c;可因为事情繁冗又遗漏了某些环节&#xff0c;导致项目不顺利。 产品经理就像是全托幼儿园的唯一一个老师&#xff0c;想要做的好就要管的多且全面&#xff0c;将自己的位置放的低一点多…

centos7环境安装单机版MinIo后台自启动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录MinIo简介一、搭建MinIo1. Linux服务器执行命令&#xff0c;查看当前系统2. 执行对应版本的minIo下载命令3. 下载完毕&#xff0c;执行启动服务命令4. minIo 启动成功…

08讲 | 基于STM32单片机NBIOT定位实战项目

前言 绘制基于 STM32 单片机的 NBIOT 实战开发板。 文章目录前言一、原理图1、绘制1&#xff09;电源供电a、USB 转 TTL 电路b、锂电池充电管理电路c、3.3V电压转换电路d、一键开关机电路2&#xff09;单片机最小系统3&#xff09;ADC电压转换电路4&#xff09;NBIOT 模组串口电…

Resin内存马逆袭之路

前言 故事还是要从很久很久以前说起&#xff0c;红蓝对抗越来越激烈&#xff0c;常见的免杀Webshell文件已经逃脱不了蓝队大佬的火眼金睛了&#xff0c;函数混淆的花里胡哨最后还是能被轻松分析&#xff0c;所以早在很多年前&#xff0c;就已经进入了内存马的时代&#xff0c;…

细讲一个 TCP 连接能发多少个 HTTP 请求(一)

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么&#xff0c;大多数回答都是说请求响应之后 DOM 怎么被构建&#xff0c;被绘制出来。但是你有没有想过&#xff0c;收到的 HTML 如果包含几十个图片标签&#xff0c;这些图片是以什么方式、什么顺序、建…

Android主页面进程卡死黑屏怎么办?多线程机制来解决

问题描述 在做一个页面跳转小案例&#xff0c;在输入页输入要计算第几项斐波那契数列&#xff0c;然后跳转到另一个页面显示计算的结果&#xff0c;当输入的值很大时&#xff0c;跳转到另一个页面时&#xff0c;页面卡死黑屏。 页面卡死黑屏问题原因 计算斐波那契数列的常规方法…