这个题的意思是让我们求“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相关推荐

  1. 【DFS】LeetCode 52. N-Queens II

    LeetCode 52. N-Queens II Solution1:我的答案 教科书一样的回溯法 <程序员面试金典>中有一道一毛一样的题啊! class Solution { publi ...

  2. LeetCode 52.N皇后II

    [LetMeFly]52.N皇后II 力扣题目链接:https://leetcode.cn/problems/n-queens-ii/ n 皇后问题 研究的是如何将n个皇后放置在n×n的棋盘上,并且使 ...

  3. LeetCode 52. N-Queens II

    原题链接在这里:https://leetcode.com/problems/n-queens-ii/description/ 题目: Follow up for N-Queens problem. N ...

  4. Java实现 LeetCode 52 N皇后 II

    52. N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解决方案 ...

  5. LeetCode—52. N皇后 II(困难)

    52. N皇后 II(困难) 题目描述: n 皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击.即令其中任意两个皇后都不同列.同行和在一条斜线上. 给你一 ...

  6. LeetCode 52. N皇后 II

    https://leetcode-cn.com/problems/n-queens-ii/ 难度:困难   n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻 ...

  7. LeetCode 52.N-Queens II

    804. N-Queens II(N 皇后 II) 题目: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回 n 皇后不同的解决 ...

  8. 【Leetcode | 52】257. 二叉树的所有路径

    给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1  /   \ 2     3  \   5 输出: ["1->2-> ...

  9. leetcode 52. N皇后 II(回溯)

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回 n 皇后不同的解决方案的数量. 示例: 输入: 4 输出: 2 解释: 4 皇 ...

最新文章

  1. matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法
  2. 从一个servlet转发到另一个servlet_javaweb02-创建第一个Servlet
  3. Python 自然语言处理(一)字频统计
  4. Ubuntu系统Apache2部署SSL证书
  5. 猴子吃桃问题(南阳ACM324)
  6. 云小课|打造企业数据“高内聚,低耦合”--试试GaussDB(DWS)逻辑集群,实现数据物理隔离
  7. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解
  8. 制作linux镜像时哪些文件时必须打包的,如何将linux系统制作成iso镜像文件?通过Mondo Rescue工具将linux系统制作成ISO镜像...
  9. oracle erp 用户手册,oracleerp用户手册-mrp
  10. bulk interface驱动_USB驱动程序(较详细)三
  11. 文件不小心删除了怎么恢复呢,怎么恢复误删除的文件
  12. 小巷开店问题(第三题)
  13. Infor LN咨询服务市场报告-行业发展机遇、市场定位及主要驱动因素
  14. SMS发送流程 Android2.2
  15. unzip unbuntu 中文乱码
  16. 使用机器学习预测天气_使用机器学习来预测患者是否会再次入院
  17. adf的主要功能之一是_ADF 入门第一步系列
  18. mongodb java 内嵌文档_MongoDB 内嵌文档
  19. Vue ElementUI 修改消息提示框样式---messageBox 的大小
  20. Yandex企业邮箱注册

热门文章

  1. 人人皆可操作的108个抖音项目:情感主播也能年入百万(8)
  2. python识别图片验证码,踩坑亲测
  3. 初阶C++——C++第二节——类和对象(大全篇)
  4. 2013年企业信息化必备的五大软件
  5. mysql基础(2)mysql基础知识
  6. 16福师硬盘是计算机的,福师16春《计算机应用基础》在线作业一分析.docx
  7. CCF2018年第一题:小明上学C++答案
  8. VB6语言语音通知接口DEMO示例
  9. 一篇带你了解深圳入户办理的条件
  10. 【ARC 自动引用计数 Objective-C语言】