力扣第51题 N 皇后 c++ 难~ 回溯题

news2024/12/27 13:06:15

题目

51. N 皇后

困难

相关标签

数组   回溯

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

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 9

思路和解题方法

首先,定义了一个名为 Solution 的类。其中:

  • ans:成员变量,用于记录所有可行的 N 皇后方案;
  • backtracking:回溯函数,用来尝试放置 N 个皇后;
  • isvalid:函数,用于检查当前位置是否可放置皇后;
  • solveNQueens:主函数,使用回溯法求解 N 皇后问题。

在 backtracking 函数中:

  • 当已经成功放置 N 个皇后时,将当前的棋盘加入答案数组 ans 中。
  • 对于每一行,在第 col 列尝试放置皇后,如果该格子可行,则标记上皇后,继续向下一行进行搜索,搜索完后回溯到上一步位置并取消标记;
  • 搜索过程中,调用函数 isvalid 进行当前位置是否可放的判断。

在 isvalid 函数中:

  • 检查当前列是否已经有皇后;
  • 检查左上方是否已经有皇后;
  • 检查右上方是否已经有皇后;
  • 如果以上均未出现皇后,则说明该位置可放置皇后,返回真。

而在主函数 solveNQueens 中:

  • 清空答案数组 ans,并定义初始棋盘状态 chessboard;
  • 调用回溯函数 backtracking 在 chessboard 中查找所有可行的 N 皇后方案;
  • 返回答案数组 ans。

复杂度

        时间复杂度:

                O(n!)

算法的时间复杂度为 O(n!),其中 n 表示棋盘大小。因为每一行只能放置一个皇后,所以在搜索下一行的时候,需要排除已经放置的皇后所在的列和两条对角线上的位置,因此每一行可选的位置数是 n,总的搜索次数是 n×(n−2)×(n−4)×⋯1=n!。

        空间复杂度

                O(n^2)

算法的空间复杂度是 O(n2),因为需要使用一个 n×n 的二维数组 chessboard 来存储棋盘状态,同时还需要使用一个二维数组 ans 来存储所有可行的 N 皇后方案。

c++ 代码

class Solution {
public:
    vector<vector<string>> ans;  // 存储所有可行的 N 皇后方案
    
    void backtracking(int n, int row, vector<string> &chessboard)
    {
        if (row == n)  // 若已成功放置 N 个皇后,将当前棋盘加入答案数组
        {
            ans.push_back(chessboard);
            return;
        }
        
        for (int col = 0; col < n; col++)  // 在当前行的每一列尝试放置皇后
        {
            if (isvalid(row, col, chessboard, n))  // 若当前位置可放置皇后
            {
                chessboard[row][col] = 'Q';  // 放置皇后
                backtracking(n, row + 1, chessboard);  // 继续下一行的搜索
                chessboard[row][col] = '.';  // 回溯到上一步,取消该位置的皇后标记
            }
        }
    }
    
    bool isvalid(int row, int col, vector<string> &chessboard, int n)
    {
        for (int i = 0; i < row; i++)
        {
            if (chessboard[i][col] == 'Q')  // 检查当前列是否已经有皇后
                return false;
        }
        
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
        {
            if (chessboard[i][j] == 'Q')  // 检查左上方是否已经有皇后
                return false;
        }
        
        for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)
        {
            if (chessboard[i][j] == 'Q')  // 检查右上方是否已经有皇后
                return false;
        }
        
        return true;  // 当前位置可放置皇后
    }

    vector<vector<string>> solveNQueens(int n) {
        ans.clear();  // 清空答案数组
        vector<string> chessboard(n, string(n, '.'));  // 初始化棋盘
        backtracking(n, 0, chessboard);  // 调用回溯函数开始搜索
        return ans;  // 返回所有可行的 N 皇后方案
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

ChessGPT:免费好用的国际象棋对弈AI机器人

对于国际象棋初学者&#xff0c;需要找一个对手来练棋。ChessGPT&#xff0c;就是一个免费好用的AI对弈机器人&#xff0c;非常适合新手来提升&#xff0c;是一个很好的练习伙伴。网站地址是&#xff1a;https://www.chess.com/play/computer&#xff0c;也有手机版app&#xf…

Deep Learning for Geophysics综述阅读(未完)

文章题目《Deep Learning for Geophysics: Current and Future Trends》 文章解读&#xff1a;地球物理学&#xff08;人工智能轨道&#xff09;——&#xff08;1&#xff09;文献翻译《面向地球物理学的深度学习&#xff1a;当前与未来趋势》 - 知乎 (zhihu.com) 这里主要列…

运筹学:影子价格(shadow price)和对偶价格(dual price)

文章目录 对偶问题的解影子价格对偶价格对偶价格与影子价格的关系总结例题 对偶问题的解 影子价格 影子价格是一个经济学意义上的解释&#xff0c;因为不同的解读&#xff0c;目前对于影子价格准确的定义较为混乱。下面下来举几个例子&#xff1a; the shadow price associat…

【代码随想录第46天】 动态规划6

代码随想录第46天| 动态规划6 完全背包518. 零钱兑换 II377. 组合总和 Ⅳ 完全背包 代码随想录&#xff1a;完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包…

解决Win10系统按 Win+L 键不能锁屏的问题

一、问题现象&#xff1a; 1、使用”WinL“快捷键无效&#xff1b; 2、系统设置 》电源与睡眠 》其他电源设置 》选择电源按钮的功能中&#xff0c;锁定选项未选中且不可选&#xff0c;且点击“更改当前不可用的设置”后仍然不可选。 3、用户操作选项中无”锁定“按钮&#…

通过TDE透明加密实现服务器防勒索 安当加密

安当TDE透明加密技术主要应用于对数据库中的数据执行实时加解密的应用场景&#xff0c;特别是在对数据加密有较高要求&#xff0c;以及希望加密后数据库性能影响几乎可以忽略的场景中。 安当TDE透明加密技术的防勒索应用场景可以通过以下步骤进行介绍&#xff1a; 数据保护&am…

淘宝商品详情API接口(标题|主图|SKU|价格|销量|库存..)

一、应用场景 淘宝商品详情接口的应用场景非常广泛&#xff0c;以下是其中几个例子&#xff1a; 商家用于展示商品信息&#xff1a;淘宝详情接口可以被用于商家的自主店铺或第三方电商平台上&#xff0c;方便展示商品详细信息。 商品价格比对&#xff1a;淘宝详情接口可以用于…

编程教室本周视频更新

入门教程、案例源码、学习资料、读者群 请访问&#xff1a; python666.cn 大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 以下是近期制作的一些编程教学视频&#xff0c;欢迎观看、点赞、收藏、转发。 0.10.2竟然不等于0.3?! Python中的小数比较是否相等时的一个…

Ruo-Yi前后端分离相关笔记

1.前提条件和基础 Spring Boot Vue 环境要求&#xff1a;Jdk1.8以上版本、MySql数据库、Redis、Maven、Vue 2.使用若依 官网地址&#xff1a;RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分…

获得Pareto前沿的方法有什么?NSGA-Ⅱ怎么获得Pareto非支配解集 + 支配解集?怎么获得Pareto前沿?/非支配解集代码实现

获得Pareto前沿的方法有什么&#xff1f; 获得Pareto前沿的方法有很多&#xff0c;下面列举了一些常用的方法&#xff1a; 权重法&#xff08;Weighted Sum Method&#xff09;&#xff1a;为每个目标函数分配一个权重&#xff0c;并将多目标优化问题转化为单目标优化问题。通…

订单30分钟自动关闭的五种解决方案

1 前言 在开发中&#xff0c;往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付&#xff0c;则自动取消生成订单60秒后,给用户发短信 对上述的任务&#xff0c;我们给一个专业的名字来形容&#xff0c;那就是延时任务 。那么这里就会产生一个问题&#xff0c;这…

ElementPlus表格中的背景透明

ElementPlus表格中的背景透明 最近写大屏&#xff0c;用到elementplus中的el-table&#xff0c;为了让显示效果好看一点&#xff0c;需要把表格的白色背景调整为透明&#xff0c;与整个背景融为一体。可以参考的资料非常少&#xff0c;大部分都是ElmentUI的方法&#xff0c;在…

摆动序列【贪心4】

题目 分析 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() < 2) return nums.size();int ret 0,left 0,right 0;for(int i 0;i < nums.size()-1;i){right nums[i1] - nums[i];if(right 0) continue;if(left …

Python数据分析实战-使用replace方法模糊匹配替换某列的值(附源码和实现效果)

实现功能 Python数据分析实战-使用replace方法模糊匹配替换某列的值 实现代码 import pandas as pd import re# 创建一个示例DataFrame data {A: [apple, banana, pineapple, orange, grape]} df pd.DataFrame(data)# 打印替换前的DataFrame print("替换前的DataFram…

5年经验之谈 —— 接口测试主要测哪些方面?

当今互联网时代&#xff0c;接口测试已经成为软件测试的一个重要组成部分。接口测试是指对系统各个接口进行验证&#xff0c;确保接口的正确性、稳定性和安全性。接口测试是软件开发过程中不可缺少的环节&#xff0c;它旨在确保接口能够正常工作&#xff0c;并且满足所需要的规…

OpenSSL 密码库实现证书签发流程详解

目录 0. 基础理论openssl简介对称加密和非对称加密生成证书流程原理CA签发流程openssl基础操作 1. 生成证书的步骤与原理2. 标准的CA签发流程2.1 创建私钥&#xff08;.key)2.2 基于私钥创建证书签名请求&#xff08;.csr&#xff09;2.3 &#xff08;可选&#xff09;直接同时…

三角形绘制

图形渲染管线的每个阶段的抽象展示 蓝色部分代表的是我们可以注入自定义的着色器的部分。现代OpenGL中&#xff0c;我们必须定义至少一个顶点着色器和一个片段着色器&#xff08;因为GPU中没有默认的顶点/片段着色器&#xff09;。 顶点输入 OpenGL是一个3D图形库&#xff0c…

智能化档案管理系统,利用超高频RFID技术提升档案管理效能

随着机关事业单位的发展&#xff0c;各种信息档案材料的数量不断增加&#xff0c;档案的类型也越来越多样化&#xff0c;传统的纸质储存方式已经无法满足现实需求。传统的档案管理方式存在一些问题&#xff0c;例如手工制作管理方法效率低下、档案储放顺序容易打乱、档案审查和…

ArmSoM-W3之RK3588硬编解码MPP环境配置

1. 简介 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 同芯片的差异&#xff0c;为使用者…

动态规划:13目标和

动态规划&#xff1a;13目标和 题目&#xff1a;494. 目标和 如何转化为01背包问题呢。 假设加法的总和为x&#xff0c;那么减法对应的总和就是sum - x。 所以我们要求的是 x - (sum - x) target x (target sum) / 2 此时问题就转化为&#xff0c;装满容量为x的背包&…