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皇后问题相关推荐

  1. leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  2. leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  3. atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  4. 去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  5. 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  6. c++两个数组对比去掉重复的元素_每日一道 LeetCode (8):删除排序数组中的重复项和移除元素...

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  7. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  8. 每日一道 LeetCode (16):求 x 的平方根

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  9. 每日一道leetcode(python)1823. 找出游戏的获胜者

    每日一道leetcode(python)1823. 找出游戏的获胜者 2021-08-07 共有 n 名小伙伴一起做游戏.小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号.确切地说,从第 i 名 ...

  10. 每日一道leetcode(python)844. 比较含退格的字符串

    每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...

最新文章

  1. 发现一个有意思的博主(科研工作者)
  2. matlab金属槽有限差分法程序,有限差分法MATLAB程序
  3. 转载: 关于显著性检验,你想要的都在这儿了!!(基础篇)
  4. 求最值(最大值和最小值)
  5. html遮罩实例,给原生html中添加水印遮罩层的实现示例
  6. URAL 1830 Help in the RNOS 思路,读题 难度:1
  7. jsp导出数据时离开页面_您应该在要离开的公司开始使用数据
  8. Xopsed的编译与安装
  9. python读写csv与数据库性能_使用python将csv文件写入SQL Server数据库
  10. 由软件工程看中国人急功近利的心态
  11. Project 4:用户画像的建立
  12. 计算机操作系统-6-并发程序设计
  13. swing mysql宾馆客房管理系统源码
  14. excel转置怎么操作_EXCEL的矩阵运算
  15. 「第六篇」0day漏洞
  16. 详细解读TPH-YOLOv5 | 让目标检测任务中的小目标无处遁形
  17. python写剧情文字游戏_零基础学Python——制作简单文字游戏
  18. 详解浅拷贝,深拷贝及实现方法
  19. python语言发展历史
  20. 计算机无法连接到internet的操作,修复无法连接到internet 【运用方式】 的设置步骤...

热门文章

  1. python中image.open函数怎么用_详解Python中open()函数指定文件打开方式的用法
  2. Java黑皮书课后题第7章:***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来。当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测
  3. c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...
  4. Halcon - 测量 - 轮廓到线的距离
  5. Java多线程-程序运行堆栈分析
  6. Mysql Order By 注入总结
  7. @Transactional注解事务不回滚不起作用无效
  8. Linux之nfs服务
  9. 分位数(quantiles)、Z-score 与 F-score
  10. 工厂模式——JavaScript