Leetcode 51 N 皇后

news2024/9/28 17:26:52

题意理解

        N皇后问题指的是在一个n×n的棋盘上,防止皇后棋子,每行、每列、每45°斜角只能有一个皇后存在。

        这是一道困难的题:困难在于:

                如何处理棋盘,如何表示棋子。

        将期盼看作是2维数组,一行一行来防止合适的棋子,似乎就好理解一些了。

        ‘.’表示棋子,‘Q’表示皇后

       

图摘自《代码随想录》

解题思路

        将其棋盘看作一个二维数组,‘.’表示棋子,‘Q’表示皇后。我们使用回溯算法来查找结果集。将其抽象为一棵树结构。

        树深=棋盘行数    树宽=棋盘列数

        用树深遍历行,树宽遍历Q可以取得位置——>目标是找到所有符合的结果。

图摘自《代码随想录》

        

1.暴力回溯+剪枝优化

前提条件,判断当前位置是否合法的,即是否能合法的放置一个皇后。

回溯的三个关键步骤:

        确定返回值和参数列表

        确定终止条件 :只有符合条件的放置才能放到最后一行,所以,当n=rowIndex时,终止。

        确定单层递归逻辑

List<List<String>> result=new ArrayList<>();

    char[][] chessboard=null;
    public List<List<String>> solveNQueens(int n) {
        chessboard=new char[n][n];
        for(char[] row:chessboard)  Arrays.fill(row,'.');
        backtracking(n,0);
        return result;
    }

    public void backtracking(int n,int rowIndex){
        //终止条件
        if(rowIndex==n){
            //收集结果并返回
            result.add(char2List(chessboard));
            return;
        }
        //当前行
        //单层逻辑
        for(int j=0;j<n;j++){
            //该位置是否能合法放置皇后,不合法则剪枝
            if(isValid(chessboard,rowIndex,j)) {
                //合法放皇后
                chessboard[rowIndex][j]='Q';
                backtracking(n,rowIndex+1);
                chessboard[rowIndex][j]='.';
            }
        }
    }

    //判断位置是否合法
    public boolean isValid(char[][] chessboard,int i,int j){
        //放置到第i层时,i+1层还没放
        int leftIndex=j;//左->右斜角检查
        int rightInndex=j;//右->左斜角检查
        while(i>0){
            i--;
            leftIndex--;
            rightInndex++;
            //列检查
            if(i>=0&&chessboard[i][j]=='Q') return false;
            //左->右斜角检查
            if(leftIndex>=0&&chessboard[i][leftIndex]=='Q') return false;
            //右->左斜角检查
            if(rightInndex<chessboard.length&&chessboard[i][rightInndex]=='Q') return false;
        }
        return true;
    }

    public List<String> char2List(char[][] chessboard){
        List<String> result=new ArrayList<>();
        for(char[] row:chessboard)
            result.add(new String(row));
        return result;
    }

2.分析

时间复杂度:O(n!) n表示皇后的个数

空间复杂度:O(n)

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

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

相关文章

融资融券超详细攻略!4.5%融资利率怎么开通?

一、融资融券是什么&#xff1f; 融资&#xff1a;顾名思义融资就是找证券公司借钱&#xff0c;然后去二级市场参与交易&#xff0c;到期归还给证券公司资金。简单来说融资就是当我们在看涨某只股票&#xff0c;但没有充足的资金时&#xff0c;这时如果你满足融资融券的条件&am…

ros2+gazebo建立机器人

Building your own robot In this tutorial we will learn how to build our own robot in SDFormat. We will build a simple two wheeled robot.本文用SDF文件建立一个2轮机器人 You can find the finished SDF file for the tutorial here.SDF文件点击下载 What is SDF SD…

Redis持久化AOF详解

基础面试题 什么是AOF AOF&#xff08;Append-Only File&#xff09;用于将Redis服务器收到的写操作追加到日志文件&#xff0c;通过该机制可以保证服务器重启后依然可以依靠日志文件恢复数据。 它的工作过程大抵分为以下几步&#xff1a; 收到客户端的写入命令(例如SET、DE…

Unity中Shader URP 简介

文章目录 前言一、URP&#xff08;Universal Render Pipeline&#xff09;由名字可知&#xff0c;这是一个 通用的 渲染管线1、Universal&#xff08;通用性&#xff09;2、URP的由来 二、Build-in Render Pipeline&#xff08;内置渲染管线&#xff09;1、LWRP&#xff08;Lig…

escapeshellarg参数绕过和注入的问题

escapeshellcmd escapeshellcmd(string $command): string command--要转义的命令。 escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数&#xff0c;或者 执行操作符 之前进行转义。 …

如何排查线上问题的?

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、预警层面 1.1 做好监控告警 1.2 定位报警层面 二、近期版本 2.1 判断最近有没有发版本 2.2 回归最近的版本 三、日志告警…

国际语音通知系统有哪些功能?

支持动态呼叫及语音播报通知 支持根据企业需求自定义语音通知内容&#xff0c;并可实现批量外呼&#xff0c;同时支持中文、英语、日语等其他国家语言。系统还可以根据不同的通知需求设置不同的呼叫策略&#xff0c;如设置外呼的启动时间段、呼叫间隔频率、呼叫次数、以及接通…

计网 - 白话TCP 三次握手过程

文章目录 概述TCP协议头的格式TCP Finite State Machine (FSM) 状态机三次握手如何在 Linux 系统中查看 TCP 状态 概述 每一个抽象层建立在低一层提供的服务上&#xff0c;并且为高一层提供服务。 我们需要知道 TCP在网络OSI的七层模型中的第四层——Transport层 -----------…

同城线下社交搭子,同城圈子交友系统

简介:打破传统耗时耗力的交友模式&#xff0c;实现1对1,点对点的快速即时交友模式&#xff0c;线上线下 整合&#xff0c;可在线查看状态以及距离远近&#xff0c;可自行设置每单的收益提成以及代理的分佣提成。 结构: TINKPHP框架 公众号H5;系统开源&#xff0c;方便二次开发…

【PostgreSQL】从零开始:(三)PgAdmin4下载与安装

【PostgreSQL】从零开始:&#xff08;三&#xff09;PgAdmin4下载与安装 pgAdmin简介liunx下部署通过yum部署pgAdmin4&#xff08;6.21&#xff09;1.安装依赖包2.永久停止防火墙3.配置pgadmin4项目源4.下载并安装pgAdmin45.执行初始化命令6.访问我们的网站 liunx下通过python方…

TCP/IP详解——ARP 协议

文章目录 一、ARP 协议1. ARP 数据包格式2. ARP 工作过程3. ARP 缓存4. ARP 请求5. ARP 响应6. ARP 代理7. ARP 探测IP冲突8. ARP 协议抓包分析9. ARP 断网攻击10. 总结 一、ARP 协议 ARP&#xff08;Address Resolution Protocol&#xff09;协议工作在网络层和数据链路层之间…

RLC防孤岛负载测试的操作和维护

孤岛现象是指当电网因故障或停电而与主电网断开连接时&#xff0c;某些部分仍然保持供电的现象。这种情况下&#xff0c;如果电力系统的保护设备不能及时检测到孤岛并切断供电&#xff0c;可能会导致严重的安全事故。因此&#xff0c;进行RLC防孤岛负载测试对于确保电力系统的安…

【MySQL】安装和配置mysql

环境&#xff1a;Centos 7 删除不需要的环境 查看是否有正在运行的服务&#xff1a; ps ajx |grep mysqlps ajx |grep mariadb切换为root用户&#xff0c; 如果存在有服务 systemctl stop mariadb.service 或者 systemctl stop mysqld查看系统下的mysql安装包并删除&#xf…

linux文本处理sed

sed常用命令详解 sed &#xff08;Stream EDitor&#xff09; a append&#xff0c;对文本追加&#xff0c;在指定行后面添加一行/多行文本c 取代&#xff0c;替换d Delete&#xff0c;删除匹配行i insert&#xff0c;表示插入文本&#xff0c;在指定行前添加一行/多行文本p …

工业磷酸行业分析:中国市场产能及消费发展研究

工业磷酸主要用于电镀工业、医药工业、磷酸盐工业及冶金工业等。磷酸蒸汽对皮肤有较强的腐蚀作用&#xff0c;工作人员应注意保护呼吸器官和皮肤。预计工业级磷酸一铵将在一定时期内保持供应趋紧的市场格局&#xff0c;其市场价格有望保持相对高位运行。 业磷酸纯品为无色透…

蛋白质的上位性效应及突变影响的范式

直接性上位效应 在这张图片中 &#xff1a; 1&#xff09;相互作用的氨基酸形成有利接触&#xff08;H和T具有H键相互作用&#xff09; 2&#xff09;H和P的空间叠加&#xff0c;属于不利的上位姓效应 3&#xff09;V和P具有更高的自由度&#xff0c;因此需要的能量更低&#…

fastapi-amis-admin快速创建一个后台管理系统增加音乐管理功能(3)

fastapi_amis_admin 是一个功能强大的框架&#xff0c;旨在帮助开发者在使用 FastAPI 进行 web 开发时&#xff0c;能够快速创建一个高效且易于管理的后台界面。通过结合 FastAPI 和 amis 的优势&#xff0c;fastapi_amis_admin 提供了一种简洁而高效的方式来构建和管理 web 应…

03进程基础-学习笔记

Process 进程 进程为操作系统的基本调度单位&#xff0c;占用系统资源(cpu,内存)完成特定任务&#xff0c;所有说进程是操作系统的标准执行单元 进程与程序的差别 程序是静态资源&#xff0c;存储与电脑磁盘中(disk磁盘资源)程序执行后会创建进程&#xff0c;负责完成功能&a…

软件测试(接口测试业务场景测试)

软件测试 手动测试 测试用例8大要素 编号用例名称&#xff08;标题&#xff09;模块优先级预制条件测试数据操作步骤预期结果 接口测试&#xff08;模拟http请求&#xff09; 接口用例设计 防止漏测方便分配工具&#xff0c;评估工作量和时间接口测试测试点 功能 单接口业…

计算机网络安全原理习题参考答案

1.9习题 一、单项选择题 1. ISO 7498-2从体系结构的角度描述了5种可选的安全服务&#xff0c;以下不属于这5种安全服务的是&#xff08;  D  &#xff09; A. 数据完整性   B. 身份鉴别   C. 授权控制   D. 数据报过滤 2. ISO 7498-2描述了8种特定的安全机制&…