LeetCode 52
这个题的意思是让我们求“n 后问题”的解法的数目,其实和上一个题基本是相似的,只需要做少量的改动就行,主要的思路如下:
1.使用 vector<string> 保存每一层的Queen的位置,然后往下一层递归,测试下一层Queen的位置,若符合要求就继续上下测试,若不符合则更换位置继续测试。
2.测试函数的编写需要注意,记得斜线上的点的测试,假设我们先将Queen置于中心上,那么该点的左右,上下,以及左上方和右下方,左下方和右上方等等都需要考虑到,不要漏掉任何一点,而且需要考虑边界问题。
3.在程序中我们应该提前检测,意思就是不要递归到最后一层才检查当前方案是否合格,我们在每一层的每个位置都需要检查是否合格,这样可以提前做出决策,这样可以大大减少递归的次数,提高程序的效率。
下面我就给出代码:
class Solution {
public:int totalNQueens(int n){int ret = 0;vector<string> oneSolve;oneSolve.clear();for (int i = 0; i < n; ++i){string tmp(n, '.');oneSolve.push_back(tmp);}_solves(ret,oneSolve, n, 0);return ret; }void _solves(int &ret,vector<string> oneSolve, int n, int index){if (index == n){++ret;return;}for (int i = 0; i < n; ++i){oneSolve[index][i] = 'Q';if (!_testQueen(oneSolve, index + 1, n)){//检查当前行,提前做出决策oneSolve[index][i] = '.';continue;}_solves(ret, oneSolve, n, index + 1);oneSolve[index][i] = '.';}}bool _testQueen(vector<string>& tmp, int m, int n){ // m行,n列(m可能小于n)int i = m - 1;int j = 0;for (; j < n; ++j){if (tmp[i][j] == 'Q'){break;}}// tmp[i][j] == 'Q'// 检查行for (int k = j + 1; k < n; ++k){if (tmp[i][k] == 'Q'){return false;}}//检查列for (int k = 0; k < i; ++k){if (tmp[k][j] == 'Q'){return false;}}for (int k = i + 1; k < m; ++k){if (tmp[k][j] == 'Q'){return false;}}//检查斜线上的//左上int beginx = i;int beginy = j;while (beginx > 0 && beginy > 0){//if (tmp[--beginx][--beginy] == 'Q'){return false;}}//右下beginx = i;beginy = j;while (beginx < m - 1 && beginy < n - 1){if (tmp[++beginx][++beginy] == 'Q'){return false;}}//左下beginx = i;beginy = j;while (beginx<m - 1 && beginy > 0){if (tmp[++beginx][--beginy] == 'Q'){return false;}}//左上beginx = i;beginy = j;while (beginx > 0 && beginy < n - 1){if (tmp[--beginx][++beginy] == 'Q'){return false;}}return true;}
};
程序的结果如下:
LeetCode 52相关推荐
- 【DFS】LeetCode 52. N-Queens II
LeetCode 52. N-Queens II Solution1:我的答案 教科书一样的回溯法 <程序员面试金典>中有一道一毛一样的题啊! class Solution { publi ...
- LeetCode 52.N皇后II
[LetMeFly]52.N皇后II 力扣题目链接:https://leetcode.cn/problems/n-queens-ii/ n 皇后问题 研究的是如何将n个皇后放置在n×n的棋盘上,并且使 ...
- LeetCode 52. N-Queens II
原题链接在这里:https://leetcode.com/problems/n-queens-ii/description/ 题目: Follow up for N-Queens problem. N ...
- Java实现 LeetCode 52 N皇后 II
52. N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解决方案 ...
- LeetCode—52. N皇后 II(困难)
52. N皇后 II(困难) 题目描述: n 皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击.即令其中任意两个皇后都不同列.同行和在一条斜线上. 给你一 ...
- LeetCode 52. N皇后 II
https://leetcode-cn.com/problems/n-queens-ii/ 难度:困难 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻 ...
- LeetCode 52.N-Queens II
804. N-Queens II(N 皇后 II) 题目: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回 n 皇后不同的解决 ...
- 【Leetcode | 52】257. 二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \ 2 3 \ 5 输出: ["1->2-> ...
- leetcode 52. N皇后 II(回溯)
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回 n 皇后不同的解决方案的数量. 示例: 输入: 4 输出: 2 解释: 4 皇 ...
最新文章
- matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法
- 从一个servlet转发到另一个servlet_javaweb02-创建第一个Servlet
- Python 自然语言处理(一)字频统计
- Ubuntu系统Apache2部署SSL证书
- 猴子吃桃问题(南阳ACM324)
- 云小课|打造企业数据“高内聚,低耦合”--试试GaussDB(DWS)逻辑集群,实现数据物理隔离
- Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解
- 制作linux镜像时哪些文件时必须打包的,如何将linux系统制作成iso镜像文件?通过Mondo Rescue工具将linux系统制作成ISO镜像...
- oracle erp 用户手册,oracleerp用户手册-mrp
- bulk interface驱动_USB驱动程序(较详细)三
- 文件不小心删除了怎么恢复呢,怎么恢复误删除的文件
- 小巷开店问题(第三题)
- Infor LN咨询服务市场报告-行业发展机遇、市场定位及主要驱动因素
- SMS发送流程 Android2.2
- unzip unbuntu 中文乱码
- 使用机器学习预测天气_使用机器学习来预测患者是否会再次入院
- adf的主要功能之一是_ADF 入门第一步系列
- mongodb java 内嵌文档_MongoDB 内嵌文档
- Vue ElementUI 修改消息提示框样式---messageBox 的大小
- Yandex企业邮箱注册