leetcode算法题之N皇后

news2025/1/11 12:47:56

N皇后也是一道很经典的问题,问题如下:

题目地址

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

解法:回溯

回溯是基于 DFS 的一种算法,它通过在解空间树中深度探索并尝试所有可能的解来解决问题。当发现当前路径无法满足问题的约束条件时,算法会“回溯”到上一步,尝试另一条路径

首先我们先建立一个二维数组,方便我们在回溯时直接更改对应的状态

const dp = new Array(n).fill(0).map(() => new Array(n).fill("."));

由当前问题我们可得知棋盘的每行必定要放置一个皇后,不然不会有满足题目的解,所以可以把每一列当作一层,把皇后放置后再到下一层继续放置,基本代码如下

const backtrack = (line) => {
  // 遍历每一行,放置皇后
  for (let i = 0; i < n; i++) {
    dp[line][i] = "Q";
    backtrack(line + 1)
    // 回溯的核心,当我们使用完后一定要将状态恢复,不然会影响下一个结果
    dp[line][i] = ".";
  }
}

backtrack(0);

接下来的问题就是我们要怎么判断当前位置可不可以放置皇后,有的童鞋可能想着所有方向都遍历一下,其实不用这么麻烦,因为我们是由上往下放置,所以只需要判断左上,上,右上的方向就可以啦

// 检测位置是否可以放皇后
const checkPosition = (x, y) => {
  // 检测上方
  let tx = x;
  while (--tx > -1) {
    if (dp[tx][y] === "Q") {
      return false;
    }
  }
  // 检测上斜左
  let lx = x,
    ly = y;
  while (--lx > -1 && --ly > -1) {
    if (dp[lx][ly] === "Q") {
      return false;
    }
  }
  // 检测上斜右
  let rx = x,
    ry = y;
  while (--rx > -1 && ++ry < n) {
    if (dp[rx][ry] === "Q") {
      return false;
    }
  }
  return true;
};

既然说到回溯,那肯定涉及到剪枝问题了,其实也不用做啥,当我们发现某一行无法放置任何皇后时,我们什么都不做,直接回溯到上一行即可

完整代码如下:

/**
 * @param {number} n
 * @return {string[][]}
 */
var solveNQueens = function (n) {
  let dp = new Array(n).fill(0).map(() => new Array(n).fill("."));
  const result = [];
  let queenNum = n;

  // 检测位置是否可以放皇后
  const checkPosition = (x, y) => {
    // 检测上方
    let tx = x;
    while (--tx > -1) {
      if (dp[tx][y] === "Q") {
        return false;
      }
    }
    // 检测上斜左
    let lx = x,
      ly = y;
    while (--lx > -1 && --ly > -1) {
      if (dp[lx][ly] === "Q") {
        return false;
      }
    }
    // 检测上斜右
    let rx = x,
      ry = y;
    while (--rx > -1 && ++ry < n) {
      if (dp[rx][ry] === "Q") {
        return false;
      }
    }
    return true;
  };
  const pushResult = () => {
    let newDp = [];
    for (let i = 0; i < n; i++) {
      newDp[i] = dp[i].join("");
    }
    result.push(newDp);
  };
  const backtrack = (line) => {
    if (line === n) {
      pushResult();
      return;
    }
    for (let i = 0; i < n; i++) {
      // 判断是否可以放置皇后
      if (line === 0 || (line > 0 && checkPosition(line, i))) {
        dp[line][i] = "Q";
        backtrack(line + 1);
        dp[line][i] = ".";
      }
    }
  };
  backtrack(0);
  return result;
};

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

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

相关文章

2:html:基础语法2

目录 2.1图像的一些注意点 2.2表格 2.2.1基本的表格 2.2.2表头与边框 2.3列表 2.3.1无序列表 2.3.2有序列表 2.4块 2.4.1块级元素 2.4.2内联元素 2.1图像的一些注意点 在上一篇中&#xff0c;我们已经知道了怎么样去将图片运用到我们的网站中&#xff0c;但是这里还…

荣耀Magicbook x14 扩容1TB固态

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 固态硬盘规格 在官网查看加装固态硬盘的接口规格 https://www.honor.com/cn/laptops/honor-magicbook-x14-2023/ https://club.honor.com/cn/thread-2847379…

XYplorer v26.30.0200绿色版

软件介绍 XYplorers是一款多标签文件管理器&#xff0c;支持多标签页栏&#xff0c;浏览文件管理时就跟使用Chrome之类的浏览器感觉一般&#xff0c;从浏览方便性&#xff0c;和切换滑顺程度&#xff0c;要比原本Windows10的Explorer文件管理器要得多。可以大部分程度上替代系…

树莓派5环境配置笔记 新建虚拟python环境—安装第三方库—配置Thonny解释器

树莓派5虚拟环境配及第三方库的安装&#x1f680; 在完成了树莓派的系统下载和各项基础配置之后进入到了&#xff0c;传感器开发部分&#xff0c;在测试传感器开发之前我打算先安装一下自己需要的库&#xff0c;但是在我直接在系统的根目录下运行pip命令的时候总会报环境错误&a…

sudo执行带重定向命令时仍提示无权限:Permission denied问题详解以及linux里的更高效下载命令mwget安装和使用效率对比

一、sudo执行带重定向命令时仍提示无权限&#xff1a;Permission denied问题详解 小问题&#xff0c;在此记录一下&#xff0c;有时在shell下执行命令重定向到文件时提示无权限-bash: temp_20181015.log: Permission denied&#xff0c;而且加sudo执行依提示无权限&#xff0c;…

CDD数据库文件制作(四)——Data Type(0x22/0x2E)

文章目录 1、新建Data Type步骤2、Data Types类型2.1 raw value2.1.1 ASCII读取和写入:零件号…2.1.2 “多字节的十六进制” 读取和写入:密钥,种子…2.1.3 “多字节的十进制” 读取和写入:参数标定和显示2.2 text table2.3 Linear2.3.1 分辨率和偏移量非1和0的读取和写入2.…

linux:进程优先级、环境变量、地址空间

进程优先级 什么叫进程优先级&#xff1f; 进程优先级是指进程获取某些资源的先后顺序 上文中的task_struct&#xff0c;也叫进程控制块&#xff08;PCB&#xff09;&#xff0c;本质上是结构体&#xff0c;我们的优先级就被写在结构体里面&#xff08;内部字段&#xff09;…

Python | Leetcode Python题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; class Solution:def reverseVowels(self, s: str) -> str:def isVowel(ch: str) -> bool:return ch in "aeiouAEIOU"n len(s)s list(s)i, j 0, n - 1while i < j:while i < n and not isVowel(s[i]):i 1while j …

模型 神经网络(通俗解读)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。仿脑智能&#xff0c;深度学习&#xff0c;精准识别。 1 神经网络的应用 1.1 鸢尾花分类经典问题 神经网络的一个经典且详细的经典应用是鸢尾花分类问题 。主要是通过构建一个神经网络模型来自动区分…

【数学建模备赛】Ep04:假设性检验

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、假设性检验&#xff1a;☀️☀️☀️1. 整体步骤2. 例子① 确定原假设和备择假设② 根据要检测的量构造一个分布③ 画出分布的概率密度图④ 给出一个置信水平β⑤ 最常见的置信水平&#xff08;95 %&#xff09;⑥…

Java流程控制07:嵌套for循环

本节教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌嵌套for循环是指将…

Linux之HTTP服务器的构建

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 参考环境参考书籍一、HTTP的工作原理1. 建立连…

k8s查看容器的日志

查询运行容器命令&#xff1a;kubectl get po -n pro 如果想查看cams系统&#xff0c;那么执行命令&#xff1a; kubectl logs pro -f -n pro &#xff08;容器名称&#xff09;|more

【HarmonyOS】端云一体化初始化项目

简介 端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务&#xff0c;可以使开发者专注于应用的业务逻辑开发&#xff0c;无需关注基础设施&#xff0c;例如&#xff1a;服务器、操作系统等问题。 因此&#xff0c;…

CentOS下分布式消息系统kafka的安装和使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前沿一、Windows主机&#xff08;G:\share&#xff09;和Linux虚拟机&#xff08;/mnt/hgfs/share&#xff09;之间文件共享1.添加Windows主机的路径2.linux安装VMw…

比特位的计算

给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --> …

我的创作纪念日【2048】

机缘 2048&#xff0c;是计算机二进制世界里很奇妙的数字&#xff0c;在CSDN上创作的第六年&#xff0c;记录从事本行业的知识学习与总结&#xff0c;好记性不如烂笔头&#xff0c;或许写的东西不如大佬的文章&#xff0c;那么有深度&#xff0c;但自己也是在坚持&#xff0c;…

计算机毕业设计选什么题目好?Java财会信息管理系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Ciallo~(∠・ω・ )⌒☆第二十篇 入门mysql 数据库

要入门MySQL数据库&#xff0c;首先需要了解数据库的基本概念和原理。MySQL是一种广泛使用的开源关系型数据库管理系统&#xff0c;它能够处理大量的数据&#xff0c;并提供了多种功能。 一、创建数据库 连接到MySQL后&#xff0c;你可以使用SQL语句来创建数据库。例如&#x…

leetcode第141题:环形链表(C语言+引申问题全解)

解题思路&#xff1a; 定义一对快慢指针&#xff0c;slow指针每次走一步&#xff0c;fast指针每次走两步。当快指针入环时&#xff0c;慢指针只走了一半。 当slow指针入环时&#xff0c;fast指针已经在环内走了许多步。让他们两个继续走&#xff0c;直到相遇&#xff0c;可以证…