51. N 皇后 (递归+回溯)

news2024/11/20 11:26:31

题目链接:力扣

解题思路:递归+回溯,n个皇后不能在同一行,同一列,同一斜线上,需要将n个皇后放在n*n的棋盘上,所以棋盘的每一行一定有一个皇后,因此可以第一行开始,在当前行放置皇后时,可以依次遍历每一列,尝试在该列上放置皇后。如果能够放置,则进入下一层递归。尝试在下一层开始放置皇后。对于n*n的棋盘可以使用二维数组保存每一个皇后的位置,不过也可以使用一维数组保存每个皇后的位置,这样更加节约空间,比如queen[0]=3,表示第一行第三列放置了一个皇后。

判断哪些位置可以放置皇后

  1. 因为依次从每一行开始往下一行进行递归,所以行不用判断是否已经存在皇后。
  2. 对于列来说,可以使用一个额外的数组col表示哪些列上已经放置了皇后,
  3. 对于同一斜线。因为同一斜线对x轴的夹角为45°(与x正轴方向45°或者与x负轴方向45°),同一斜线上的点满足一个规律,对于两个坐标(x1,y1),(x2,y2)在同一斜线上,则Math.abs(x1-x2)==Math.abs(y1-y2)

递归函数:process(int[] col, int[] queen, int num, List<List<String>> result):

  1. 参数:col保存哪些列上有皇后,col[0]=1,表示第0列上有皇后,col[0]=0,表示没有。queen保存皇后的位置,num表示当前需要在第几行放置皇后(从第0行开始放置)。result保存结果
  2. 递归终止条件:
    1. 如果num=n,则表示已经放置完所有的皇后了。生成一个结果,并保存在result中
  3. 否则:依次遍历每一列:
    1. 判断当前位置能够放置皇后:
      1. 能放置:
        1. col[i]=1,表示第i列放置了一个皇后
        2. queen[num]=i,第num行第i列有一个皇后
        3. process(col, queen, num + 1, result),在num+1行放置皇后
        4. 回溯:col[i] = 0,表示第i列可以放置皇后。也就是取消在num行第i列放置皇后,接下来后执行for循环,在下一列放置皇后。从而枚举所有可以位置皇后的位置

AC代码:

class Solution {
    public static List<List<String>> solveNQueens(int n) {
        List<List<String>> result = new ArrayList<>();
        int[] col = new int[n];
        int[] queen = new int[n];
        process(col, queen, 0, result);
        return result;
    }

    public static void process(int[] col, int[] queen, int num, List<List<String>> result) {
        if (num == col.length) {
            generateData(queen, result);
        }
        for (int i = 0; i < col.length; i++) {
            if (isPlace(col, queen, num, i)) {
                col[i] = 1;
                queen[num] = i;
                process(col, queen, num + 1, result);
                col[i] = 0;
            }
        }
    }
    
    //判断当前位置(x1,y1)是否可以放置皇后
    public static boolean isPlace(int[] col, int[] queen, int x1, int y1) {
        if (col[y1] == 1) {
            return false;
        }
        boolean flag = true;
        for (int x2 = 0; x2 < x1; x2++) {
            int y2 = queen[x2];
            if (Math.abs(x1 - x2) == Math.abs(y1 - y2)) {
                return false;
            }
        }
        return true;
    }
    
    //生成结果加入到result中
    public static void generateData(int[] queen, List<List<String>> result) {
        List<String> data = new ArrayList<>();
        for (int col : queen) {
            char[] row = new char[queen.length];
            Arrays.fill(row, '.');
            row[col] = 'Q';
            String rowStr = new String(row);
            data.add(rowStr);
        }
        result.add(data);
    }
}

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

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

相关文章

计算机毕设 大数据电商用户行为分析及可视化

文章目录 1. 数据集说明2. 数据处理2.1 数据导入2.2 数据清洗 3.数据分析可视化3.1 用户流量及购物情况3.2 用户行为转换率3.3 用户行为习惯3.4 基于 RFM 模型找出有价值的用户3.5 商品维度的分析 4 最后 1. 数据集说明 这是一份来自淘宝的用户行为数据&#xff0c;时间区间为…

大数据分析平台能为企业带来哪些好处_光点科技

大数据分析平台是近年来迅速发展的一项关键技术&#xff0c;它利用先进的数据处理和分析技术&#xff0c;帮助企业从海量数据中提取有价值的信息和见解。对于企业来说&#xff0c;拥有一个强大的大数据分析平台可以带来许多好处。 首先&#xff0c;大数据分析平台可以帮助企业更…

【ArcGIS微课1000例】0070:制作宾馆酒店分布热度热力图

本文讲解在ArcGIS中,基于长沙市酒店宾馆分布矢量点数据(POI数据)绘制酒店分布热力图。 相关阅读: 【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图 【ArcGIS Pro微课1000例】0028:绘制酒店分布热力图(POI数据) 文章目录 一、加载宾馆分布数据二、绘制热度图一、加载宾…

[QT编程系列-11]:C++图形用户界面编程,QT框架快速入门培训 - 5- QT主要控件与自定义控件

目录 5. QT主要控件 5.1 预定义控件 5.2 自定义控件 5.3 用预定义容器橙子和提升自定义控件 5.3 后记 5. QT主要控件 5.1 预定义控件 在Qt中&#xff0c;有许多预定义的控件&#xff08;Widgets&#xff09;可用于创建用户界面。这些控件提供了各种常见的用户界面元素&am…

五笔没落之五笔学习热潮

1998年&#xff0c;一个风雨交加的下午&#xff0c;有一个年轻人骑着一辆破旧的自行车来到电脑培训班&#xff0c;学习五笔打字。那时电脑还很贵&#xff0c;他一个月的工资只有几百元&#xff0c;根本买不起电脑&#xff0c;所以选择参加培训班。那时会打字就像现在的硕士生那…

Java----Nacos服务注册

除了通过Eureka&#xff0c;还可以通过我们的Nacos进行注册服务&#xff0c;方法也很简单。 前提&#xff01;需要开启Nacos服务&#xff0c;在官网中下载对应的压缩包&#xff0c;然后启动&#xff0c;如下windows需要输入命令&#xff1a; startup.cmd -m standalone 然后会…

Qt+C++多线程thread-QThread-QTimer视频-控件动画-混合应用实例

程序示例精选 QtC多线程thread-QThread-QTimer混合应用实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC多线程thread-QThread-QTimer混合应用实例>>编写代码&#xff0c…

事务@transactional执行产生重复数据

背景 系统设计之初&#xff0c;每次来新请求&#xff0c;业务层会先查询数据库&#xff0c;判断是否存在相同的id数据&#xff08;id是唯一标识产品的&#xff09;&#xff0c;有则返回当前数据库查到的数据&#xff0c;根据数据决定下一步动作&#xff0c;没有则认为是初次请…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…

火山引擎徐广治:边缘云,下一代云计算

6月30日&#xff0c;2023稀土开发者大会在北京举办。大会以「代码不止&#xff0c;掘金不停」为主题&#xff0c;与上百位海内外技术专家一起剖析行业最新动态&#xff0c;为一直在路上的技术开发者们&#xff0c;拓宽技术视野&#xff0c;传播前沿的技术理念。火山引擎边缘云资…

图腾柱电路

驱动MOS或者IGBT管&#xff0c;需要比较大的驱动电流或者灌电流 使用图腾柱电路或许是一个好的办法 电流路径是这样的 当CTL1端口输出为高电平的时候 三极管Q2的2脚为高&#xff0c;三极管Q2不导通 三极管Q1的2脚为高&#xff0c;三极管导通 所以Q1的3脚和1脚导通 VCC--…

C++笔记(总)

15重载 为什么使用重载 可以让函数名相同 提高复用性 函数重载需要满足的条件 1.函数的作用域相同 2.函数的返回值相同 3.函数的参数类型不同,或者参数的个数不相同或者参数的顺序不相同或者参数的类型不相同 4.不能用函数的返回值作为判断重载判断的条件。 举个例子 根…

月薪9.8K!打破年龄瓶颈~30岁前台测试转后台优化,他说:未来可期!

海压竹枝低复举&#xff0c;风吹山角晦还明&#xff01; 是啊&#xff0c;人这一辈子&#xff0c;该走的弯路&#xff0c;该吃的苦&#xff0c;该撞的南墙&#xff0c;一样都少不了&#xff0c;但只要我们能坚强挺住&#xff0c;熬过去&#xff0c;跨过去&#xff0c;好运自然来…

《Python机器学习:基于PyTorch和Scikit-Learn》——小解送书第五期

目录 书籍介绍 内容简介 作者简介 参与抽奖 书籍介绍 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来…

【踩坑】gin框架middleware中间件如何中途跳出

gin框架middleware中间件如何中途跳出 背景 我在是使用gin web框架的时候需要自定义鉴权方式&#xff0c;那当然就要用到middleware这个方式了&#xff0c;代码如下所示&#xff0c;需要判断uid和token是否合法&#xff0c;不合法直接返回401状态&#xff0c;不继续往下执行 …

Android JNI引用类型管理 (十)

🔥 Android Studio 版本 🔥 🔥 JNI三种引用类型 🔥 全局引用、局部引用、弱引用 如果使用得当可以提升程序的性能, 否则会造成程序崩溃或者内存泄漏 🔥 创建包含JNI的类 JNIReference.java 🔥 package com.cmake.ndk1.jni;public class JNIReference {static {S…

什么是分布式微服务?

什么是分布式微服务&#xff1f; 前言什么是微服务举例说明 什么是分布式图解分布式与微服务单体架构及部署微服务架构分布式影响 分布式微服务架构什么是分布式微服务架构面临的问题 前言 本文旨在讲清楚什么是分布式微服务架构&#xff0c;通过解释微服务架构和分布式架构&a…

基于Java+SpringBoot+Vue的乐器社区网站设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

37.SpringBoot实用篇—开发(上册)

目录 一、SpringBoot实用篇—开发。 &#xff08;1&#xff09;热部署&#xff08;开发阶段使用&#xff09;。 &#xff08;1.1&#xff09;手动启动热部署。 &#xff08;1.2&#xff09;自动启动热部署。 &#xff08;1.3&#xff09;热部署范围配置。 &#xff08;1.…

概率栅格

欢迎访问我的博客首页。 概率栅格 1. miss 表与 hit 表 1. miss 表与 hit 表 miss 表和 his 表是一维数组&#xff0c;它们存放的都是空闲值&#xff0c;用于更新概率栅格。其下标 i i i 代表旧空闲值&#xff0c;元素 t a b l e [ i ] table[i] table[i] 代表旧空闲值 i i …