每天一道LeetCode-----n皇后问题
N-Queens
原题链接N-Queens
n皇后问题,和数独问题一样,都是回溯法的经典题目。
n皇后问题约束是任意两个皇后不能在一行,不能在一列,不能在同一个45度直线,不能在同一个135度直线上。所以求解时需要记录
- 当前行是否已经存在一个皇后
- 当前列是否已经存在一个皇后
- 当前位置所在的45度直线上是否已经存在一个皇后
- 当前位置所在的135度直线上是否已经存在一个皇后
因为n行n个皇后,所以每一行有且仅有一个皇后,那么可以不需要记录当前行是否已经存在皇后,只要在当前行找到一个位置容纳皇后,就开始在下一行寻找,即每一行遍历右边列,找到满足后三个条件的位置即可。
所有的约束条件都可以用数组记录,即
- flag_col[column]表示column列是否已经存在一个皇后
- flag_45[p]表示位置[row, column]所在的45度直线是否出现过皇后,其中p是row和column的函数
- flag_135[q]表示位置[row, column]所在的135度直线是否出现过皇后,其中q是row和column的函数
比较不要记录的就是45度和135度直线上的情况,可以利用数学思维简化。
- 对于45度直线,可知斜率为1,即解析式可以写成
y = x + b
。那么对于在同一条45度直线的点,截距b是一定的,所以可以用y - x来代表某一条45度直线,所以可以另m = column - row
。但是column可能会小于row,导致m为负值,所以可以将m增加n - 1让m变为正值,即m = n - 1 + column - row
- 对于135度直线,可知斜率为-1,同理可知另
m = column + row
,此时不存在m为负值的情况,无须加n - 1 - 不过需要注意的是flag_45和flag_135数组的大小是2 * n - 2,设置成2 * n即可
class Solution {
public:vector<vector<string>> solveNQueens(int n) {vector<vector<string>> res;vector<string> cur(n, string(n, '.'));vector<int> flag_col(n, 1), flag_45(2 * n, 1), flag_135(2 * n, 1);solveNQueens(n, 0, cur, res, flag_col, flag_45, flag_135);return res;}
private:void solveNQueens(int n, int row, vector<string>& cur, vector<vector<string>>& res, vector<int>& flag_col, vector<int>& flag_45, vector<int>& flag_135){if(row >= n){res.emplace_back(cur);return;}/* 回溯法 */for(int i = 0; i < n; ++i){if(flag_col[i] && flag_45[n - 1 + i - row] && flag_135[i + row]){cur[row][i] = 'Q';flag_col[i] = flag_45[n - 1 + i - row] = flag_135[i + row] = 0;solveNQueens(n, row + 1, cur, res, flag_col, flag_45, flag_135);cur[row][i] = '.';flag_col[i] = flag_45[n - 1 + i - row] = flag_135[i + row] = 1;}}}
};
每天一道LeetCode-----n皇后问题相关推荐
- leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!
作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...
- leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- 去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...
作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...
- 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- c++两个数组对比去掉重复的元素_每日一道 LeetCode (8):删除排序数组中的重复项和移除元素...
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...
- 每日一道 LeetCode (16):求 x 的平方根
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 每日一道leetcode(python)1823. 找出游戏的获胜者
每日一道leetcode(python)1823. 找出游戏的获胜者 2021-08-07 共有 n 名小伙伴一起做游戏.小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号.确切地说,从第 i 名 ...
- 每日一道leetcode(python)844. 比较含退格的字符串
每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...
最新文章
- 发现一个有意思的博主(科研工作者)
- matlab金属槽有限差分法程序,有限差分法MATLAB程序
- 转载: 关于显著性检验,你想要的都在这儿了!!(基础篇)
- 求最值(最大值和最小值)
- html遮罩实例,给原生html中添加水印遮罩层的实现示例
- URAL 1830 Help in the RNOS 思路,读题 难度:1
- jsp导出数据时离开页面_您应该在要离开的公司开始使用数据
- Xopsed的编译与安装
- python读写csv与数据库性能_使用python将csv文件写入SQL Server数据库
- 由软件工程看中国人急功近利的心态
- Project 4:用户画像的建立
- 计算机操作系统-6-并发程序设计
- swing mysql宾馆客房管理系统源码
- excel转置怎么操作_EXCEL的矩阵运算
- 「第六篇」0day漏洞
- 详细解读TPH-YOLOv5 | 让目标检测任务中的小目标无处遁形
- python写剧情文字游戏_零基础学Python——制作简单文字游戏
- 详解浅拷贝,深拷贝及实现方法
- python语言发展历史
- 计算机无法连接到internet的操作,修复无法连接到internet
【运用方式】
的设置步骤...
热门文章
- python中image.open函数怎么用_详解Python中open()函数指定文件打开方式的用法
- Java黑皮书课后题第7章:***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来。当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测
- c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...
- Halcon - 测量 - 轮廓到线的距离
- Java多线程-程序运行堆栈分析
- Mysql Order By 注入总结
- @Transactional注解事务不回滚不起作用无效
- Linux之nfs服务
- 分位数(quantiles)、Z-score 与 F-score
- 工厂模式——JavaScript