【刷题笔记】N皇后||回溯||符合思维方式

N皇后II

1 题目详情

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

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

https://leetcode.cn/problems/n-queens-ii/

在这里插入图片描述

2 分析

刚一开始的时候我认为这道题很难,防止n个皇后在同一行这件事很容易,我们在递归的时候,每次调用递归函数,将当前放置的皇后的所在行标记为true,这样下一列我们在放皇后的时候,前面皇后的所在行都不能防止皇后。

但是难就难在,如何确定让皇后们不在同一条斜线上?

在这里插入图片描述

在这里插入图片描述

斜率为1的斜线,斜线上所有的皇后所在点的y-x都是等值的。斜率为-1的斜线,斜线上所有的皇后所在点的x+y都是等值的,我们只需要记录下当前步骤放置的皇后所在点的x+yx-y的值,那么就相当于记录下了该皇后所在的两条斜线。

3 代码

class Solution {int res = 0;Set<Integer> sets1 = new HashSet<>(); // 记录斜率为1的斜线Set<Integer> sets2 = new HashSet<>(); // 记录斜率为-1的斜线public int totalNQueens(int n) {dfs(new boolean[n], n, 0);return res;}public void dfs(boolean[] visted_row, int n, int index) {if (index == n) { // index其实表示的是当前所在列res++;return;}for (int i = 0; i < n; i++) {if (visted_row[i]) continue;int real_row = i + 1; // yint real_col = index + 1; // xif (sets1.contains(real_row-real_col)) continue; if (sets2.contains(real_row+real_col)) continue; sets1.add(real_row-real_col); // 记录y-xsets2.add(real_row+real_col); // 记录y+xvisted_row[i] = true; dfs(visted_row, n, index + 1);visted_row[i] = false;sets1.remove(real_row-real_col); // 移除sets2.remove(real_row+real_col); // 移除}}
}

在这里插入图片描述

那么我们用同样的方法也可以做51. N 皇后,只需要在每次dfs的时候记录下当前皇后的坐标,最后创建n*n的棋盘,所有点置为.,然后将皇后坐标置为Q

class Solution {List<List<String>> res = new ArrayList<>();Set<Integer> sets1 = new HashSet<>(); // 记录斜率为1的斜线Set<Integer> sets2 = new HashSet<>(); // 记录斜率为-1的斜线List<int[]> points = new ArrayList<>();List<List<int[]>> total_points = new ArrayList<>();public List<List<String>> solveNQueens(int n) {List<List<String>> res = new ArrayList<>();dfs(new boolean[n], n, 0);// 将total_points中的每个point_list变换成n*n的矩阵,有点的地方变成Q,没有点的地方变成.for (List<int[]> point_list : total_points) {char[][] matrix = new char[n][n];for (int i = 0; i < n; i++) {Arrays.fill(matrix[i], '.');}for (int[] point : point_list) {matrix[point[0]][point[1]] = 'Q';}List<String> matrix_str = new ArrayList<>();for (int i = 0; i < n; i++) {matrix_str.add(new String(matrix[i]));}res.add(matrix_str);}return res;}public void dfs(boolean[] visted_row, int n, int index) {if (index == n) { // index其实表示的是当前所在列total_points.add(new ArrayList<>(points));return;}for (int i = 0; i < n; i++) {if (visted_row[i]) continue;int real_row = i + 1; // yint real_col = index + 1; // xif (sets1.contains(real_row-real_col)) continue;if (sets2.contains(real_row+real_col)) continue;sets1.add(real_row-real_col); // 记录y-xsets2.add(real_row+real_col); // 记录y+xvisted_row[i] = true;points.add(new int[]{index, i});dfs(visted_row, n, index + 1);points.remove(points.size() - 1);visted_row[i] = false;sets1.remove(real_row-real_col); // 移除sets2.remove(real_row+real_col); // 移除}}
}

在这里插入图片描述

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

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

相关文章

由@EnableWebMvc注解引发的Jackson解析异常

同事合了代码到开发分支&#xff0c;并没有涉及到改动的类却报错。错误信息如下&#xff1a; Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.conv…

【Python机器学习系列】一文讲透机器学习中的K折交叉验证(源码)

一、简介 前面我详细介绍了关于机器学习的归一化和反归一化以及表格数据在机器学习中的输入格式问题&#xff1a; 一文彻底搞懂机器学习中的归一化与反归一化问题 【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式&#xff08;理论源码&#xff09; 本文将介绍…

Mysql workbench

下载地址: https://download.csdn.net/download/a876106354/88616595

Numpy: 修改numpy的dtype

要修改NumPy数组的dtype&#xff0c;可以使用astype()方法。这个方法将创建一个新的数组&#xff0c;其数据类型&#xff08;dtype&#xff09;由参数指定。 下面是一个例子&#xff0c;展示如何将一个NumPy数组的dtype从int64修改为float32: import numpy as np# 创建一个in…

进程概念【linux】

进程基础 在学习进程之前&#xff0c;首先要有一定的计算机硬件和软件基础。 硬件基础&#xff1a;冯诺依曼体系结构 如图&#xff0c;是计算机在硬件上的体系结构。 下面举出一些常见的输入输出设备&#xff08;有些设备只作输出设备&#xff0c;或者只作输入设备&#xff…

LLM之Prompt(三)| XoT:使用强化学习和蒙特卡罗树搜索将外部知识注入Prompt中,性能超过CoT,ToT和GoT

​论文地址&#xff1a;https://arxiv.org/pdf/2311.04254.pdf 一、当前Prompt技术的局限性 LLM使用自然语言Prompt可以将复杂的问题分解为更易于管理的“thought”可以回复用户的问题。然而&#xff0c;大多数现有的Prompt技术都有局限性&#xff1a; 输入输出&#xff08;I…

【QT 5 调试软件+Linux下调用脚本shell-经验总结+初步调试+基础样例】

【QT 5 调试软件Linux下调用脚本shell-经验总结初步调试基础样例】 1、前言2、实验环境3、自我总结4、实验过程&#xff08;1&#xff09;准备工作-脚本1&#xff09;、准备工作-编写运行脚本文件2&#xff09;、给权限3&#xff09;、运行脚本 &#xff08;2&#xff09;进入q…

pytorch一致数据增强

分割任务对 image 做&#xff08;某些&#xff09;transform 时&#xff0c;要对 label&#xff08;segmentation mask&#xff09;也做对应的 transform&#xff0c;如 Resize、RandomRotation 等。如果对 image、label 分别用 transform 处理一遍&#xff0c;则涉及随机操作的…

计算机网络网络层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 路由算法静态路由与动态路由距离-向量算法链路状态路由算法层次路由 IPv4&#xff08;这个必考&#xff09;IPv4分组IPv4地址与NAT子网划分与子网掩码、CIDRARP、DHCP与ICMP地址解析协议ARP动态主机配置协议DHCP IPv6IPv6特点 路由协议…

android studio 创建按钮项目

1&#xff09;、新建一个empty activity项目&#xff0c;切换到project视图&#xff1a; 2&#xff09;、修改app\src\main\res\layout\activity_main.xml文件&#xff0c;修改后如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <andr…

设置Ubuntu或树莓派系统,允许root用户ssh方式连接

Ubuntu 或 Raspbian 系统默认不允许root 用户以ssh方式连接。连接会报如下错误&#xff1a; Permission denied&#xff0c; please try again. 解决步骤&#xff1a; &#xff08;如果是树莓派系统&#xff1a;烧录到内存卡后&#xff0c;拔掉内存卡再重新插到PC机上&#x…

html基础知识

1、文字阴影代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <meta http-eq…

Vue 工作开发小技巧

一、汇总 ​ 本博客&#xff0c;记录了一些Vue在日常开发工作中比较实用的小技巧&#xff0c;后续会陆续添加更新。 ​ 1、利用Sass的:global定义全局样式。 ​ 2、在<style>内部使用v-bind给CSS属性绑定属性值。 ​ 3、父子组件传值时&#xff0c;使用.sync修饰符后…

#HarmonyOS:访问应用资源--系统资源

访问应用资源 在工程中&#xff0c;通过"$r(‘app.type.name’)"的形式引用应用资源。app代表是应用内resources目录中定义的资源&#xff1b;type代表资源类型&#xff08;或资源的存放位置&#xff09;&#xff0c;可以取“color”、“float”、“string”、“plu…

cgteamwork与shotgrid对比

最近有项目接触使用并二开cgteamwork&#xff0c; 也重新认识了cgteamwork&#xff0c;感受到国产软件的强大&#xff0c;国内中小CG公司的首选&#xff0c;原因&#xff1a; 1 上手容易&#xff0c;不会的有售前工程师教&#xff0c;他们全国各地城市到处跑。 感概业务的强大…

Linux: 查看服务器的CPU信息

在linux服务器环境下&#xff0c;可以使用cat /proc/cpuinfo命令查看当前CPU的核数等信息。 cat /proc/cpuinfo 字段解析 /proc/cpuinfo 是一个特殊的文件&#xff0c;在 Linux 系统中提供有关 CPU 的详细信息。它实际上是一个伪文件系统中的文件&#xff0c;通过它可以获取到…

智能优化算法应用:基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.生物地理学算法4.实验参数设定5.算法…

Visual studio+Qt开发环境搭建以及注意事项和打开qt的.pro项目

下载qt-然后安装5.14.2_msvc2017 不知道安装那个就全选5.14.2的父级按钮 https://download.qt.io/archive/qt/5.14/5.14.2/ 安装Visual studio,下载直接下一步就行 配置Visual studio的qt环境 在线安装-重启Visual studio会自动安装 离线安装-关闭Visual studio点击安装 关闭…

c++向线程函数传递参数及编译错误排查

c向线程函数传递参数及编译错误排查 普通传递 void func(int a) {cout << "a " << a << endl; }int main() {thread t(func, 1); // 第一个是函数名字&#xff0c;第二个函数的参数t.join(); // 注意&#xff0c;不写join会报core dumped }当传…

find_package 和 find_library的区别

背景 经常看CMakeLists.txt中有find_package和find_library&#xff0c;有时候没留意以为都一样&#xff0c;其实二者差距比较大&#xff0c;下面简单记录一下。 find_package find_package(NAME), 这段代码的本质就是在找一个NAME.cmake这个文件&#xff0c;一般在安装库的…