N 皇后问题的算法原理及实现 【新手详解 回溯】

引言

N 皇后问题是一个经典的回溯算法问题,基本上不管是打算法还是学数据结构的同学们肯定都写过至少听说过这题,n 皇后问题是在一个 N×N 的棋盘上放置 N 个皇后,使得任意两个皇后都不能在同一行、同一列或同一条对角线上。这里将详细介绍 N 皇后问题的算法原理,并通过 Java 代码示例来展示如何实现这一算法。


1. 问题描述

51. N 皇后 - 力扣(LeetCode)

给定一个整数 n,返回所有不同的解决方案,每种方案中 n 个皇后在 n × n 的棋盘上放置,且不能互相攻击。

  • 每个解决方案包含一个明确的 n × n 棋盘布局。
  • 'Q' 表示皇后,. 表示空位。

2. 算法原理

2.1 回溯算法

回溯算法是一种通过递归来解决问题的方法,它尝试所有可能的候选解,并在发现不符合条件时回退(撤销之前的决策),继续尝试其他可能的解。N 皇后问题非常适合使用回溯算法,因为我们需要尝试所有可能的位置来放置皇后,并在发现冲突时进行剪枝。

2.2 剪枝优化⭐⭐⭐

这里可以无脑对每个放置的皇后的位置的横纵对角线遍历是否已经有其他皇后,但是这样遍历的效率太低了,虽然leetcode 还是能过。

为了提高效率,我们可以利用以下剪枝优化:

  • 列检查:使用一个布尔数组 CheckCol 来记录每一列是否已经放置了皇后。
  • 正对角线检查:使用一个布尔数组 dig1 来记录从左下到右上的每条对角线是否已经放置了皇后。
  • 反对角线检查:使用一个布尔数组 dig2 来记录从左上到右下的每条对角线是否已经放置了皇后。

通过这些剪枝优化,我们可以快速判断当前格子是否可以放置皇后,从而避免无效的递归调用。


3. 代码实现

public class Solution {
    boolean[] CheckCol, dig1, dig2;
    char[][] path;
    List<List<String>> ret;
    int n;

    public List<List<String>> solveNQueens(int _n) {
        // 初始化变量
        n = _n;    
        CheckCol = new boolean[n];
        dig1 = new boolean[2 * n];
        dig2 = new boolean[2 * n];
        path = new char[n][n];
        ret = new ArrayList<>();
        
        // 初始化棋盘
        for (int i = 0; i < n; i++) {
            Arrays.fill(path[i], '.');
        }
        
        // 从第 0 行开始进行深度优先搜索
        dfs(0);
        
        return ret;
    }

    private void dfs(int row) {
        if (row == n) {
            // 找到一个解决方案
            List<String> tmp = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                tmp.add(new String(path[i]));
            }
            ret.add(tmp);
            return;
        }
        
        for (int col = 0; col < n; col++) {
            // 检查当前位置是否可以放置皇后
            if (!CheckCol[col] && !dig1[row - col + n] && !dig2[row + col]) {
                // 放置皇后
                path[row][col] = 'Q';
                CheckCol[col] = true;
                dig1[row - col + n] = true;
                dig2[row + col] = true;
                
                // 递归处理下一行
                dfs(row + 1);
                
                // 回溯,撤销之前的操作
                path[row][col] = '.';
                CheckCol[col] = false;
                dig1[row - col + n] = false;
                dig2[row + col] = false;
            }
        }
    }
}

4. 代码详解

4.1 变量初始化
  • CheckCol:用于记录每一列是否已经放置了皇后。
  • dig1 和 dig2:分别用于记录两条对角线是否已经放置了皇后。
  • path:表示当前的棋盘状态。
  • ret:存储所有的解决方案。
  • n:表示棋盘的大小。
4.2 初始化棋盘
  • 使用 Arrays.fill 方法将棋盘中的每个格子初始化为 .
4.3 深度优先搜索 (DFS
  • 从第 0 行开始,逐行尝试放置皇后。
  • 对于每一行,遍历每一列,检查当前位置是否可以放置皇后。
  • 如果可以放置皇后,则更新棋盘状态和相关标志,并递归处理下一行。
  • 如果到达最后一行并成功放置皇后,则记录当前解决方案。
  • 递归结束后,回溯撤销之前的操作,继续尝试其他可能的位置。

5. 总结

其实很早之前就写过这道题了,这次重刷算法的时候又遇见了,就写篇博客啦。这里只介绍回溯法。有问题评论区dd,感谢阅览!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

告别背锅侠!29个空场景及测试方法的实战指南

想必大家在日常的测试工作中&#xff0c;经常会碰到以下这些场景&#xff1a; 场景一&#xff1a; 测试人员&#xff1a;有一个数据为空的场景还没有验证。 研发人员&#xff1a;这个场景不会出现&#xff0c;因为没有删除逻辑。 场景二&#xff1a; 研发人员&#xff1a;…

蓝桥杯模块二:数码管的静态、动态实现

模块二训练 1.静态显示 一、数码管电路图 二、电路分析 1.数码管电路分析 端口分公共端和段码&#xff0c;先用公共端控制一个数码管&#xff0c;再用段码实现显示数字。共阳数码管公共端输入高电平&#xff0c;段码输入低电平实现点亮 2.锁存器 Y7控制段码&#xff0c;Y6控…

【含文档】基于Springboot+微信小程序 的中心医院用户移动端(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

全志科技发布T536高性能智慧工业芯片,飞凌嵌入式率先推出配套核心板

2024年9月24日下午&#xff0c;全志科技在中国国际工业博览会上成功举办了其最新产品——T536高性能智慧工业芯片的全球首发发布会。这款芯片采用创新的4核Cortex-A55与RISC-V混合架构&#xff0c;主频分别达到1.6GHz和600MHz&#xff0c;并集成了2TOPS算力的NPU&#xff0c;吸…

生信初学者教程(四):软件

文章目录 RRstudioLinux系统其他软件本书是使用R语言编写的教程,用户需要下载R和RStudio软件用于进行分析。 版权归生信学习者所有,禁止商业和盗版使用,侵权必究 R R语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

耦合微带线单元的网络参量和等效电路公式推导

文档下载链接&#xff1a;耦合微带线单元的网络参量和等效电路资源-CSDN文库https://download.csdn.net/download/lu2289504634/89583027笔者水平有限&#xff0c;错误之处欢迎留言&#xff01; 一、耦合微带线奇偶模详细推导过程 二、2,4端口开路 三、2端口短路、3端口开路 四…

智能密码、指纹锁语音芯片ic方案 可存放40s语音内容 NVD语音芯片

随着科技的飞速发展&#xff0c;智能家居安全领域迎来了前所未有的变革。智能密码与指纹锁作为现代家庭安全防护的重要一环&#xff0c;其背后的语音芯片IC开发更是这一变革中的关键技术突破。 智能密码、指纹锁语音芯片ic方案 选型与简介&#xff1a; NVD语音芯片是一款低成…

quiz: python网络爬虫之规则1

下面答错了&#xff1a; B c 8A&#xff0c; 9A

STM32F407之超声波模块使用

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "HC_SR04.h"int main() {OS_ERR err;//错误uart_init(9600);//串口初始化//超声波初始化HC_SR04();//OS初始化 他是第一个运行的函…

【大数据】数据中台怎么样助力企业创新和客户实践

在当今数字化时代&#xff0c;数据成为了企业竞争的关键因素。企业拥有大量的数据&#xff0c;但如何高效地利用这些数据&#xff0c;实现创新和提升客户体验&#xff0c;成为了一项重要的挑战。数据中台作为一种重要的数据管理和分析工具&#xff0c;发挥着关键的作用。本文将…

大数据毕业设计选题推荐-食品销售数据分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

数集相等定义凸显“R各元x的对应x+1的全体=R”是几百年重大错误

黄小宁 变量x所取各数也均由x代表&#xff0c;x代表其变域&#xff08;x所有能取的数组成的集&#xff09;内任一元。设集A&#xff5b;x&#xff5d;表A各元均由x代表&#xff0c;&#xff5b;x&#xff5d;中变量x的变域是A。其余类推。因各数x可是数轴上点的坐标所以x∈R变换…

AWS Network Firewall -NAT网关配置只应许白名单域名出入站

1. 创建防火墙 选择防火墙的归属子网&#xff08;选择公有子网&#xff09; 2. 创建规则白名单域名放行 3. 绑定相关规则 继续往下拉 绑定非托管规则 4. 配置网络路由 相关规则 参考图 解释 防火墙的归属公有子网路由表规则机器实例的规则子网路由表规则nat网管路…

springboot实战学习(7)(JWT令牌的组成、JWT令牌的使用与验证)

接着上篇博客的学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验的基础上&#xff0c;基本完成用户模块的登录接口的主逻辑以及提到了问题&#xff1a;"用户未登录&#xff0c;需要通过登录&#xff0c;获取到令牌进行登录认证&#xff0c;…

Linux 安装redis主从模式+哨兵模式3台节点

下载 https://download.redis.io/releases/ 解压 tar -zxvf redis-7.2.4.tar.gz -C /opt chmod 777 -R /opt/redis-7.2.4/安装 # 编译 make # 安装&#xff0c; 一定是大写PREFIX make PREFIX/opt/redis-7.2.4/redis/ install配置为系统服务 cd /etc/systemd/system/主服务…

一文上手SpringSecuirty【六】

自定义认证流程完成之后,前端收到了后端生成的token,那么在之后的所有请求当前,都必须携带token.作为服务器来说,得验证这个token,是否合法. 一、验证token是否合法 1.1 OncePerRequestFilter过滤器 OncePerRequestFilter是 Spring 框架中的一个过滤器&#xff0c;用于确保在…

基于nodejs+vue的校园二手物品交易系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片&#xff08;如 ESP32、ESP32-S2、ESP32-C3 等&#xff09;提供 Ru…

如何在 Three.js 场景中创建可点击展开的标签

在复杂的可视化场景中&#xff0c;经常需要为 3D 对象添加可交互的标签&#xff0c;以便用户点击时可以查看详细信息。这篇文章将通过一个简单的案例展示&#xff0c;如何在 Three.js 中为对象创建可点击的标签&#xff0c;点击标签可以展开详细信息&#xff0c;再次点击可以关…

论文复现:考虑电网交互的风电、光伏与电池互补调度运行(MATLAB-Yalmip-Cplex全代码)

论文复现:考虑电网交互的风电、光伏与电池储能互补调度运行(MATLAB-Yalmip-Cplex全代码) 针对风电、光伏与电化学储能电站互补运行的问题,已有大量通过启发式算法寻优的案例,但工程上更注重实用性和普适性。Yalmip工具箱则是一种基于MATLAB平台的优化软件工具箱,被广泛应用…