当前位置: 首页 > news >正文

leetcode 困难 —— N 皇后(简单递归)

(不知道为啥总是给这种简单的递归设为困难题,虽然优化部分很不错,但是题目太好过了)

题目:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

题解:
首先看眼数据范围,1 <= n <= 9,这么小的数据,估计就是枚举了

那我们怎么枚举呢,遍历在前 i 行已经确定的情况下,第 i + 1 行所有可取的情况
(第 0 行则每一列所有都可取)

那我们怎么判断可不可取呢
① 该列和以前行的列重合
② 该列和以前行的列在一条斜线上(当前行 - 以前行 = | 当前列 - 以前列 |)

然后我们把以前的行的选择列,用一个字符串表示即可
例 “13524”,第一行选第一列,第二行选第三列…

代码如下:

class Solution {
public:vector<string> solve(string pre, int n) {vector<string> res;bool flag[10];for(int i = 0; i < n; i++) {flag[i] = true;}int m = pre.size();for(int i = 0; i < m; i++) {flag[pre[i] - '0'] = false;if(pre[i] - '0' - m + i >= 0) flag[pre[i] - '0' - m + i] = false;if(pre[i] - '0' + m - i < n) flag[pre[i] - '0' + m - i] = false;}vector<string> temp;for(int i = 0; i < n; i++) {if(flag[i] && m != n - 1) {temp = solve(pre + char(i + '0'), n);res.insert(res.end(), temp.begin(), temp.end());}else if(flag[i] && m == n - 1) {res.push_back(pre + char(i + '0'));}}return res;}vector<vector<string>> solveNQueens(int n) {vector<vector<string> > res;vector<string> t = solve("", n);for(int i = 0; i < t.size(); i++) {vector<string> temp;for(int j = 0; j < n; j++) {string str = "";for(int k = 0; k < n; k++) {if(k != t[i][j] - '0') {str = str + '.';}else {str = str + 'Q';}}temp.push_back(str);}res.push_back(temp);}return res;}
};

接下来,我们考虑优化

在这里插入图片描述

有没有觉得,这个很像二进制的位移

我们用三个二进制数字分别表示,在左斜线上的,在右斜线上的,在一条直线上的
每一个二进制数字都是表示当前行的状态

接下来每过一行,我们二进制位移一次即可(表示直线上的不用二进制位移)
这样空间和时间复杂度都降低了

http://www.lryc.cn/news/839.html

相关文章:

  • AWS实战:Dynamodb到Redshift数据同步
  • 机器学习评估指标的十个常见面试问题
  • 常见的安全问题汇总 学习记录
  • 元宵晚会节目预告没有岳云鹏,是不敢透露还是另有隐情
  • 计算机视觉 吴恩达 week 10 卷积
  • JavaScript 函数定义
  • 设计模式:建造者模式教你创建复杂对象
  • 在C++中将引用转换为指针表示
  • PS快速入门系列
  • ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
  • JVM从看懂到看开Ⅲ -- 类加载与字节码技术【下】
  • 服务器常用的41个状态码及其对应的含义
  • 万里数据库加入龙蜥社区,打造基于“龙蜥+GreatSQL”的开源技术底座
  • 为什么不推荐使用CSDN?
  • apisix 初体验
  • time时间模块
  • 如何判断反馈电路的类型-反馈类型-三极管
  • C++ 实现生命游戏 Live Game
  • 什么是QoS?QoS是如何工作的?QoS的实验配置如何进行?
  • AcWing 840. 模拟散列表
  • 【网络工程】常见HTTP响应状态码
  • Python之ruamel.yaml模块详解(二)
  • 若依框架 --- 偶发的el-select无法选择的问题
  • 【Linux】tmpfile 使用介绍
  • 实现光线追踪重投影的方法
  • Hyperbolic Representation Learning for CV
  • In Context Learning 相关分享
  • 【前端笔试题一】:解析url路径中的query参数
  • K_A12_001 基于STM32等单片机采集火光火焰传感参数串口与OLED0.96双显示
  • Java基础42 枚举与注解