代码随想录Day25 回溯算法 LeetCode T51 N皇后问题

news2024/11/17 11:39:58

目录

前言

LeetCode T51 N皇后问题

题目思路:

回溯三部曲:

2.终止条件

3.一次搜索逻辑

4.isValid合法性判断

5.Array2List

题目代码:

总结:


 

前言

又来到了我们的周末,今天我们挑战一道困难题:N皇后问题,相信大家都玩过一个经典的小游戏:8皇后 

游戏规则是:在一个n*n的棋盘上,放置nge 皇后,要求每个皇后所在的一排一列并且对角线都不能存在皇后,放满n个皇后即为胜利.

LeetCode T51 N皇后问题

游戏链接:八皇后游戏 (gitee.io)

题目链接:51. N 皇后 - 力扣(LeetCode)

题目思路:

这题我们仍然使用回溯算法解决问题

首先我们画出树状图,我们以三皇后举例(无解)

回溯三部曲:

1.回溯函数参数

参数我们取一个二维数组(来记录棋盘的情况),一个n来控制我们树的宽度,也就是棋盘的宽度和高度,一个r变量来记录我们此刻位于哪一行

 public void backtracking(char[][] chessboard,int n,int r)

2.终止条件

我们发现这道题的取值结果仍然是在叶子结点,所以我们的终止条件就是遍历到最后一行就开始收割结果

        if(r == n)
        {
            res.add(Array2List(chessboard));
            return;
        }

3.一次搜索逻辑

for循环,从0开始遍历到n即可,如果判断合法,就填入'Q',再实现回溯即可

这里不用进行去重操作,因为每一排只取一个值

        for(int i = 0;i<n;i++)
        {
            if(isVaild(r,i,n,chessboard))
            {
                chessboard[r][i] = 'Q';
                backtracking(chessboard,n,r+1);
                chessboard[r][i] = '.';
            }
        }

4.isValid合法性判断

这里我们需要判断棋盘皇后的落点是否合法

 public  boolean isVaild(int row,int col,int n,char[][] chessboard )
    {
        //竖着
        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-1;i--,j++)
        {
            if(chessboard[i][j] == 'Q')
            {
                return false;
            }
        }
        return true;
    }

5.Array2List

这里细心地小伙伴就会发现我创建的Array2List是自己创建的,因为这里需要进行一次chessboard和list的一次转换,这里我们需要实现list下的这个自定义方法

 public List Array2List(char[][] chessboard) {
        List<String> list = new ArrayList<>();

        for (char[] c : chessboard) {
            list.add(String.copyValueOf(c));
        }
        return list;
    }

题目代码:

class Solution {
    List<List<String>> res = new ArrayList<>();
    public List<List<String>> solveNQueens(int n) {
        char chessboard[][] = new char[n][n];
        for(char[] c :chessboard)
        {
            Arrays.fill(c,'.');
        }
        backtracking(chessboard,n,0);
        return res;

    }
    public void backtracking(char[][] chessboard,int n,int r)
    {
        if(r == n)
        {
            res.add(Array2List(chessboard));
            return;
        }
        for(int i = 0;i<n;i++)
        {
            if(isVaild(r,i,n,chessboard))
            {
                chessboard[r][i] = 'Q';
                backtracking(chessboard,n,r+1);
                chessboard[r][i] = '.';
            }
        }
       
    }
    //定义接口
      public List Array2List(char[][] chessboard) {
        List<String> list = new ArrayList<>();

        for (char[] c : chessboard) {
            list.add(String.copyValueOf(c));
        }
        return list;
    }

    //检查合法性
    public  boolean isVaild(int row,int col,int n,char[][] chessboard )
    {
        //竖着
        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-1;i--,j++)
        {
            if(chessboard[i][j] == 'Q')
            {
                return false;
            }
        }
        return true;
    }
}

总结:

本题是我们解决棋盘问题的第一道题目。

如果从来没有接触过N皇后问题的同学看着这样的题会感觉无从下手,可能知道要用回溯法,但也不知道该怎么去搜。

这里我明确给出了棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度,这样就可以套进回溯法的模板里了

大家可以在仔细体会体会!

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

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

相关文章

Python学习第2天-安装pycharm

文章目录 前言一、下载二、安装1.选择安装目录2.安装配置 总结 前言 好用的工具可以极大地提高生产力&#xff0c;开发Python推荐使用jetbrains全家桶的pycharm。 一、下载 通过官网下载安装包。 二、安装 1.选择安装目录 2.安装配置 一路Next&#xff0c;安装完成 总结 …

ANR系列之八:疑难ANR问题处理记录

前言&#xff1a; 本文仅是记录作者自身处理过的ANR问题&#xff0c;以及帮助他人解决过的ANR问题。本文中所介绍的ANR处理记录仅供参考&#xff0c;并不适用所有场景。并且最终结论和分析并不一定就是绝对正确的。 案例1.页面切换时前台应用焦点未获得 案例编号&#xff1a;…

从零开始学CAPL

从零开始学CAPL CAPL和C语言的关系和介绍C语言的基础语法常量变量标识符关键字数据类型整数数据字符数据实型数据(浮点数据)运算符以及优先级类型转换printf函数 选择程序结构设计if语句switch语句 循环结构程序设计while语句do……while语句for语句break和continue 数组函数 C…

VueComponent的原型对象

一、prototype 每一个构造函数身上又有一个prototype指向其原型对象。 如果我们在控制台输入如下代码&#xff0c;就能看到Vue构造函数的信息&#xff0c;在他身上可以找到prototype属性&#xff0c;指向的是Vue原型对象&#xff1a; 二、__proto__ 通过构造函数创建的实例对…

Mybatis拦截器

MyBatis插件介绍 MyBatis提供了一种插件(plugin)的功能&#xff0c;虽然叫做插件&#xff0c;但其实这是拦截器功能。 MyBatis允许使用者在映射语句执行过程中的某一些指定的节点进行拦截调用&#xff0c;通过织入拦截器&#xff0c;在不同节点修改一些执行过程中的关键属性&…

apache搭建静态网站,moongoose搭建网站后台,出现的跨域问题解决

文章目录 1&#xff0c;问题描述1.1&#xff0c;当网页和后台是不同服务时会产生跨域问题1.2&#xff0c;跨域问题 2&#xff0c;nginx端口转发解决跨域问题2.1&#xff0c;下载并安装nginx2.1.1&#xff0c;解压后如下所示2.1.2&#xff0c;进入解压目录后&#xff0c;执行配置…

SAP-QM-动态检验规则

Dynamic Modification Rule &#xff08;动态修改规则&#xff09; 1、决定样本大小的方式有3种&#xff1a; 手动输入比例大小采样过程 物料主数据质量视图 2、采样过程的创建方式有2种 跟批量大小有关系&#xff1a;百分比/AQL跟批量大小没有关系&#xff1a;固定值 而当…

Jetpack:014-Jetpack中的小红点

文章目录 1. 概念介绍2. 使用方法2.1 Badge2.2 BadgedBox 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack库中底部栏相关的内容&#xff0c;本章回中主要介绍 小红点。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff01; 1. 概念介绍 我们在本章回中…

Android C/C++ native编程NDK开发中logcat的使用

Android C/C native编程NDK开发中logcat的使用 前言具体用法 前言 在NDK开发过程中&#xff0c;C/C层&#xff0c;需要对代码进行一些调试&#xff0c;日志打印是我们解决异常或崩溃的重要手段&#xff0c;这里我就简单介绍下日志打印三步走。 首先我们先看下官方文档关于日志…

渗透测试--JWT攻防(一)

JWT简介 JWT代表JSON Web Token&#xff0c;它是一种用于安全地在不同实体之间传递信息的开放标准&#xff08;RFC 7519&#xff09;。JWT通常用于身份验证和授权领域&#xff0c;以及在网络应用程序和服务之间传递声明&#xff08;claims&#xff09;信息。 JWT的常见用途包括…

S7-1200通过CM CANopen模块与KINCO伺服连接

CM CANopen模块简介 CM CANopen模块&#xff08;Profinet转CANopen&#xff09;来自瑞典HMS &#xff0c;由西 门子授权HMS公司开发&#xff0c;与S7-1200完美兼容。 可做为S7-1200与CANopen/CAN设备之间的桥梁&#xff0c;能够联接任意 CANopen或CAN 2.0A设备到SIMATIC S7-1…

聊聊分布式架构10——Zookeeper入门详解

目录 01ZooKeeper的ZAB协议 ZAB协议概念 ZAB协议基本模式 消息广播 崩溃恢复 选举出新的Leader服务器 数据同步 02Zookeeper的核心 ZooKeeper 的核心特点 ZooKeeper 的核心组件 选举算法概述 服务器启动时的Leader选举 服务器运行期间的Leader选举 03ZooKeeper的…

PT100温度传感器

热电阻是中低温区&#xfe61;常用的一种温度检测器。它的主要特点是测量精度高&#xff0c;性能稳定。其中铂热电阻的测量精确度是&#xfe61;高的&#xff0c;它不仅广泛应用于工业测温&#xff0c;而且被制成标准的基准仪。金属热电阻的感温元件有石英套管十字骨架结构&…

智能洗地机哪个牌子好用?智能洗地机品牌排行榜

为了偷懒人类发明了扫把、拖把等手动清洁工具&#xff0c;随着技术的进步出现了吸尘器、扫地机器人等等智能产品&#xff0c;近几年洗地机又以快速、直接、高效对市场进行了“颠覆”&#xff0c;如何快速在洗地机市场中挑选到适合自己的智能洗地机呢&#xff0c;我们一起来看看…

2023-10-18 LeetCode每日一题(执行 K 次操作后的最大分数)

2023-10-18每日一题 一、题目编号 2530. 执行 K 次操作后的最大分数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的…

node快速搭建一个学习资料共享平台

概述 本文要实现的功能比较简单&#xff1a;1、将想要共享的文件分文件夹的组织起来&#xff1b;2、别人可以通过界面进行搜索&#xff1b;3、可以在线预览或下载文件。基于这样的需求&#xff0c;本文分享通过node如何实现这样的功能。 实现效果 实现 1. node端服务 node端…

QT 操作Windows系统服务

Windows服务是在Windows操作系统上运行的后台应用程序&#xff0c;它们在系统启动时自动启动&#xff0c;并在后台持续运行&#xff0c;不需要用户交互。Windows服务的作用包括但不限于以下几个方面&#xff1a;1. 提供系统功能&#xff1a;许多Windows服务提供了系统级的功能和…

【Java题】实现继承和多态的例子

一&#xff1a;题目 1.员工类Employee&#xff1a; &#xff08;1&#xff09;私有成员变量&#xff1a;姓名&#xff0c;年龄&#xff0c;工资 &#xff08;2&#xff09;提供无参&#xff0c;有参构造 &#xff08;3&#xff09;成员方法&#xff1a;work()方法——员工工作 …

【算法|动态规划No.28】leetcode1312. 让字符串成为回文串的最少插入次数

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

lv8 嵌入式开发-网络编程开发 19 原始套接字

目录 1 链路层原始套接字用法 1.1 利用原始套接字实现类似wireshark的功能 1.2 利用原始套接字实现ping命令 2 网络层原始套接字用法 2.1 TCP原始套接字用法 1 链路层原始套接字用法 Linux中的原始套接字&#xff08;Raw Socket&#xff09;是一种高级套接字类型&#xff…