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

Leetcode 51 N Queens Leetcode N Queens II

题意

给定一个数字 n n n,形成n*n的棋盘,棋盘上放n个皇后,确保皇后之间不会相互吃(皇后可以直线吃,斜线吃)

链接

https://leetcode.com/problems/n-queens/description/

思考

这道题只能暴力枚举所有的位置,但是如果直接在二维矩阵上做空间复杂度比较高,可以降维度

题解

dfs枚举所有可以放n皇后的地方。构造一个数组pos, p o s [ i ] pos[i] pos[i]代表在第i行第pos[i]列放一个皇后。
结束条件为,当pos数组长度为n,根据pos数组构造二维的答案
传入参数u表示当前pos数组添加到第几个元素(实际上是第u行皇后应该放在什么位置),遍历这个元素所有的可能性(0-n 列),并且判断新放入皇后是否和前面所有的皇后列数相同,是否和前面所有的皇后在同一个对角线上,如果不在,那么第u位就选了,要选择第u+1位元素,注意回溯。

对角线性质

请添加图片描述

class Solution {
public:vector<vector<string>> res; vector<vector<string>> solveNQueens(int n) {//pos保证所有的n queens不可能在同一行,所以循环中只需要check//是不是同一列或者斜对角就可以vector<int> pos;dfs(0, pos, n);return res;}void dfs(int u, vector<int>& pos, int n) {if( u == n ) {vector<string> str(n, string(n, '.'));for(int i = 0; i < n; i++) {str[i][pos[i]] = 'Q';}res.push_back(str);return;}for(int i = 0; i < n; i++) {if(isValid(pos,u, i)) {pos.push_back(i);dfs(u+1, pos, n);pos.pop_back();}}}bool isValid(vector<int>& pos, int row, int col) {int m = pos.size();for(int i = 0; i < m; i++) {int preRow = i;int preCol = pos[i];if(col == preCol) return false;if(abs(row-preRow) == abs(col - preCol)) return false;}return true;}
};

时间复杂度: O ( N 2 ∗ N ! ) O(N^2* N!) O(N2N!)
空间复杂度: O ( N ) O(N) O(N)

N Queens II是统计所有不同的方案数,一样的解法

class Solution {
public:int cnt = 0;int totalNQueens(int n) {vector<int> pos;dfs(0, pos, n);return cnt;}void dfs(int u, vector<int>& pos, int n) {if( u == n) {cnt++;return;}static vector<bool> col(n, false);static vector<bool> diag(2*n-1, false);static vector<bool> udiag(2*n-1, false);        for(int i = 0; i < n; i++) {int r = u;int c = i;if(!col[c] && !diag[r+c] && !udiag[r-c+n-1]) {pos.push_back(i);col[c] = diag[r+c] = udiag[r-c+n-1] = true;dfs(u+1, pos, n);col[c] = diag[r+c] = udiag[r-c+n-1] = false;pos.pop_back();}}}
};

时间复杂度: O ( N 2 ∗ N ! ) O(N^2* N!) O(N2N!)
空间复杂度: O ( N ) O(N) O(N)


http://www.mrgr.cn/news/78338.html

相关文章:

  • windows 应用 UI 自动化实战
  • 15 go语言(golang) - 并发编程goroutine原理及数据安全
  • 解决stuid项目类爆炸问题
  • spark 写入mysql 中文数据 显示?? 或者 乱码
  • RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)
  • 一键AI换脸软件,支持表情控制,唇形同步Facefusion-3.0.0发布!支持N卡和CPU,一键启动包
  • Qt程序发布及打包成exe安装包
  • Windows Server 2019 虚拟机 安装Oracle19c,图文详情(超详细)
  • Chrome和edge浏览器如何为任何网站强制暗模式
  • git 学习笔记
  • VTK中对于相机camera的设置
  • 机载视频流回传+编解码方案
  • 分布式调用 - 服务间的远程调用RPC
  • Linux系统硬件老化测试脚本:自动化负载与监控
  • Github 基本使用学习笔记
  • 老旧前端项目如何升级工程化的项目
  • 【大模型】从零样本到少样本学习:一文读懂 Zero-shot、One-shot 和 Few-shot 的核心原理与应用!
  • 【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话
  • 去哪儿大数据面试题及参考答案
  • 使用Compose Multiplatform开发跨平台的Android调试工具
  • 小程序 - 个人简历
  • VUE练习
  • Vue学习历程一
  • 圆域函数的傅里叶变换和傅里叶逆变换
  • Jenkins的使用
  • npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法