leetcode51,52 N皇后相关(回溯方法)

news2024/11/16 22:34:35

题目1:N皇后
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
在这里插入图片描述
输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
分析思路:
首先明确此问题限制条件:每一横行,竖行,斜行不能出现超过一个皇后
可以考虑运用unordered_set来记录unordered_set的优点(去重容器)
1.直接存取数据的值,对比unordered_map<int,int>
2.容器内部各元素不相等
3.不会将元素按照key值排序,对比ordered_set

需要一个queen变量来存放每一行皇后放的具体列,之后打印面板board(用"Q",“.”)来打印二维数组,至于怎么得到正确的皇后的位置,应该采用逐个遍历,但是普通循环解决不了这个问题,本质上是在逐个尝试,当发现不合适时及时退出,所以采用回溯方法

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        unordered_set<int>columns;//容易内部各元素不能相同
        unordered_set<int>dial1;
        unordered_set<int>dial2;
       auto solution=vector<vector<string>>();
       auto queens=vector<int>(n,-1);
       backtrack(solution,queens,n,0,columns,dial1,dial2);
       return solution;
    }
    void backtrack(vector<vector<string>>& solution,vector<int>&queens,int n,int row,unordered_set<int>&columns,unordered_set<int>&dial1,unordered_set<int>&dial2)
    {
        if(row==n){
            vector<string> board= generateboard(queens,n);
            solution.push_back(board);
            }
        else
        {
            for(int i=0;i<n;i++)
            {
                if(columns.find(i)!=columns.end())
                {
                    continue;
                }
                int dial_1= row-i;//同一条斜线上的每个位置满足行下标与列下标之差相等(0,0) 和(3,3) ,i代表列
                if(dial1.find(dial_1)!=dial1.end())//要保证dial1中没有出现过当前值
                {
                    continue;
                }
                int dial_2=row+i;
                if(dial2.find(dial_2)!=dial2.end())
                {
                    continue;
                }
                queens[row]=i;//在所有不满足条件进行之后  才开始插入
                columns.insert(i);
                dial1.insert(dial_1);
                dial2.insert(dial_2);
                backtrack(solution, queens, n, row + 1, columns, dial1, dial2);//回溯
                queens[row]=-1; //回溯之后要重置
                columns.erase(i);//之前插入的不符合条件的需要删除
                dial1.erase(dial_1);
                dial2.erase(dial_2);
            }
        }
    }

     vector<string> generateboard(vector<int> &queens, int n) {
        auto board = vector<string>();
        for (int i = 0; i < n; i++) {
            string row = string(n, '.');//初始化全部置为....
            row[queens[i]] = 'Q';//queens[i] //代表第i行的皇后应该放的列的位置
            board.push_back(row);
        }
        return board;
    }
};

题目二:N皇后二
n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。

class Solution {
public:
    int totalNQueens(int n) {
        unordered_set<int>colunms;
        unordered_set<int>dia1s;
        unordered_set<int>dia2s;
        vector<int>queens(n,-1);
        //int solve_cnt=0;
        //backtrack(colunms,dia1s,dia2s,0,queens,solve_cnt,n);
        return backtrack(colunms,dia1s,dia2s,0,queens,n);
    
    }
    int backtrack(unordered_set<int>&colunms,unordered_set<int>&dia1s,unordered_set<int>&dia2s,int row,vector<int>&queens,int n)
    {
        if(row==n)
        {
            return 1;
        }
        else
        {
            int count=0;
            for(int i=0;i<n;i++)
            {
                if(colunms.find(i)!=colunms.end())
                {
                    continue;
                }
                //colunms.insert(i);//i代表列
                int dia1=row+i;
                if(dia1s.find(dia1)!=dia1s.end())
                {
                    continue;
                }
                //dia1s.insert(dia1);
                int dia2=row-i;
                if(dia2s.find(dia2)!=dia2s.end())
                {
                    continue;
                }
                colunms.insert(i);//i代表列 //在所有不满足条件进行之后  才开始插入
                dia1s.insert(dia1);
                dia2s.insert(dia2);
                queens[row]=i;
                count+=backtrack(colunms,dia1s,dia2s,row+1,queens,n);
                colunms.erase(i);
                dia1s.erase(dia1);
                dia2s.erase(dia2);
                queens[row]=-1;                          
                }
            return count;
        }
    }
};

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

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

相关文章

入职一年,那个准的下班的人,比我先升职了...

最近心态崩了。 和我同期一道进公司的人又升了一级&#xff0c;可是明明大家在进公司时&#xff0c;他不论是学历还是工作经验&#xff0c;样样都不如自己&#xff0c;眼下不过短短的两年时间便一跃在自己的职级之上&#xff0c;这着实让我有几分不甘心。 我想不明白&#xff…

谈谈Linux epoll惊群问题的原因和解决方案

近期排查了一个问题&#xff0c;epoll惊群的问题&#xff0c;起初我并不认为这是惊群导致&#xff0c;因为从现象上看&#xff0c;只是体现了CPU不均衡。一共fork了20个Server进程&#xff0c;在请求负载中等的时候&#xff0c;有三四个Server进程呈现出比较高的CPU利用率&…

OpenCV 图像平滑处理

本文是OpenCV图像视觉入门之路的第10篇文章&#xff0c;本文详细的在图像上面进行了图像均值滤波、方框滤波 、高斯滤波、中值滤波、双边滤波、2D卷积等操作。 OpenCV 图像平滑处理目录 1 均值滤波 2 方框滤波 3 高斯滤波 4 中值滤波 5 双边滤波 6 2D卷积(自定义…

电子技术——分立MOS放大电路

电子技术——分立MOS放大电路 有了前两节的学习&#xff0c;即三种放大器配置和偏置方法之后&#xff0c;我们可以通过现成的分立晶体管、电阻、电容等搭建分立MOS放大电路。 DC偏置基本结构 在本节我们选用的DC偏置基本结构是如图所示的源极恒流源的偏置方案&#xff0c;下图…

用#define宏实现Add函数

✋作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C语言 我们知道#define宏是一种非常暴力的替换&#xff0c;宏定义会在程序编译预处理阶段在调用宏的位置进行文本内容的直接替换&#xff0c;因此我们在使用宏定义实现Add加法函数时就要注意一些可能会报错的问题。 …

第九层(10):STL之函数对象

文章目录前情回顾函数对象概念特点谓词概念内建函数对象分类算术仿函数关系仿函数逻辑仿函数下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更新有关C/C语法&a…

你是如何学习 Java 的?

每一个行业中能成为大佬的人&#xff0c;一定都有他自己一套具有独到见解的方法...... 这个问题我很有发言权&#xff0c;从刚毕业做Java实习生月薪2k&#xff0c;到现在干了5年Java开发月薪43k&#xff0c;一直都在保持不断学习的状态。以我个人的经验来看&#xff0c;一个程…

视频分割新范式:视频感兴趣物体实例分割 VOIS

1. 背景视频中物体分割是视频理解的基础算法&#xff0c;也是对淘宝商品视频分析和加工所依赖的重要能力。传统的视频分割任务一般分为两种类型&#xff1a;一种是VOS&#xff08;Video Object Segmentation&#xff09;&#xff0c;该任务需要在第一帧给出物体的初始分割标注&…

Linux系列 目录和文件管理

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 简介 本章重点 一.检查文本内容 ​编辑 1.cat命令——显示并…

MySQL分表查询之Merge存储引擎实现

概念介绍 MySQL 分表之后怎么进行联合查询&#xff1f;用有表数量限制的 union all&#xff0c;还是汇总到一张表再查询&#xff0c;亦或用Sphinx&#xff08; 高性能SQL全文检索引擎 &#xff09;&#xff1f; 在这篇文章里&#xff0c;介绍使用 Merge [mɜːrdʒ] 存储引擎…

浅读人月神话(2)

读书笔记&#xff1a;今日翻书浅读&#xff0c;从《为什么巴比伦塔会失败》开始至《干将莫邪》结束&#xff0c;巴比伦塔的建造对当下项目推进有广泛借鉴意义&#xff0c;今天这几个章节在PMBOK中有一些可以互相对照学习的内容&#xff0c;《为什么巴比伦塔会失败&#xff1f;》…

荔枝派 zero 使用 Jlink 调试

Jlink 所谓硬件版本&#xff0c;就是这个调试器的硬件是第几代&#xff0c;我手上的这个是 V8 所谓固件版本&#xff0c;就是这个调试器主芯片中内置的软件是什么版本&#xff0c;我刷入的是 J-Link ARM V8 compiled Nov 28 2014 13:44:46 所谓 Jlink 工具版本&#xff0c;就…

记录--原生 canvas 如何实现大屏?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 可视化大屏该如何做&#xff1f;有可能一天完成吗&#xff1f;废话不多说&#xff0c;直接看效果&#xff0c;线上 Demo 地址 lxfu1.github.io/large-scree…。 看完这篇文章(这个项目)&#xff…

在线支付系列【13】微信支付之签名验签流程分析

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言签名生成签名验证总结前言 在上篇文档中&#xff0c;我们简单实现了对接微信支付的几个接口。了解到wechatpay-apache-httpclient框架自动实现了签名和验签&#xff0c;接下来跟踪下源码&a…

LeetCode-136. 只出现一次的数字

目录题目分析哈希集位运算题目来源 https://leetcode.cn/problems/single-number/ 题目分析 题目有个条件可谓相当重要&#xff0c;即凡重复的元素最多重复一次&#xff08;原话&#xff1a;给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个…

详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

文章目录1. 描述1.1 MybatisPlusInterceptor1.2 InnerInterceptor2. 实现2.1 不带条件的分页查询2.2 带条件的分页查询2.3 简述Page类3. 注意事项1. 描述 1.1 MybatisPlusInterceptor 我们在开发的过程中&#xff0c;经常会遇到分页操作&#xff0c;其分为逻辑分页和物理分页…

Gif动态图片如何用静图制作?教你静图合成动图的方法

gif动图如何制作&#xff1f;相信对于gif动图大家都不陌生&#xff0c;在平时的聊天软件中、公众号文章中都可以看到。那么&#xff0c;要如何制作gif动图呢&#xff1f;下面&#xff0c;就给教大家两个在线gif制作&#xff08;https://www.gif.cn/&#xff09;的方法&#xff…

综合案例【商品管理系统-Java基础版】(附完整源码)

Java语言的一个超级简易的商品管理系统&#xff0c;适合初学者练手 源码包无法上传至资源&#xff08;blog已经超级完整啦&#xff09;如果还是需要完整源码src包可私分享 目录1 项目分析1.1 用户模块&#xff08;普通用户、管理员用户&#xff09;1.1.1前端系统&#xff08;普…

FluentReader为什么称之为高颜值的rss阅读器

Fluent Reader 这是一款 RSS 阅读器。对于很多年轻的网友来说&#xff0c;RSS 这个名词可能有点陌生。简单来说只要某个网站支持 RSS&#xff0c;你订阅了 RSS 后&#xff0c;一旦网站更新了内容&#xff0c;就会推送到你面前。这时候&#xff0c;我们就需要一款像 Fluent Rea…

全屋智能三国志

刚刚过去的春节假期&#xff0c;对我来说&#xff0c;是一个收集现实素材、感应社会变化的好机会。也确实发现了不少新趋势&#xff0c;一个结论是&#xff1a;智能家居正在酝酿新一轮的市场浪潮。以央视春晚作为切口&#xff0c;每年央视春晚的广告投放&#xff0c;都一定程度…