51. N 皇后

n皇后问题要求皇后放置后,同一行,同一列,同一斜线上不存在其他的皇后即可

采用回溯法解决该问题

同时应该设置一个函数判断当该位置放置皇后后,是否合法

因为是采用回溯法放置皇后,每行只放置一个皇后所以不必检查同一行,目前只剩下同一列,同一斜线(45°角和135°角)

每次检查应从插入位置向左上或向右上开始检查,否则发生问题

检查函数如下:

    bool isVaild(int col, int row, vector<string>& path, int n) {//判断列for (int i = 0; i < row; i++) {if (path[i][col] == 'Q') return false;}//判断45°角for (int i = col - 1, j = row - 1; i >= 0 && j >= 0; i--, j--) {if (path[j][i] == 'Q') return false;}//判断135°角for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (path[i][j] == 'Q') return false;}return true;}

回溯三部曲

1、递归函数参数---

    vector<vector<string>> result; //记录结果集//n代表总行数,row代表遍历到哪一行了,path表示填充结果void backtracking(int n, int row, vector<string> path)

2、终止条件------当row==n时,此时可以记录结果

        //终止条件if (row == n) {result.push_back(path);return ;}

3、单层搜索过程------

递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。

每次都是要从新的一行的起始位置开始搜,所以都是从0开始。

        for (int i = 0; i < n; i++) {if (isVaild(i, row, path, n)) { //判断此位置是否符合条件path[row][i] = 'Q';backtracking(n, row + 1, path);path[row][i] = '.'; //回溯}}

本题代码如下:

class Solution {
public:vector<vector<string>> result; //记录结果集//n代表总行数,row代表遍历到哪一行了,path表示填充结果void backtracking(int n, int row, vector<string> path) {//终止条件if (row == n) {result.push_back(path);return ;}//for (int i = 0; i < n; i++) {if (isVaild(i, row, path, n)) { //判断此位置是否符合条件path[row][i] = 'Q';backtracking(n, row + 1, path);path[row][i] = '.'; //回溯}}}bool isVaild(int col, int row, vector<string>& path, int n) {//判断列for (int i = 0; i < row; i++) {if (path[i][col] == 'Q') return false;}//判断45°角for (int i = col - 1, j = row - 1; i >= 0 && j >= 0; i--, j--) {if (path[j][i] == 'Q') return false;}//判断135°角for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (path[i][j] == 'Q') return false;}return true;}vector<vector<string>> solveNQueens(int n) {result.clear();std::vector<std::string> path(n, std::string(n, '.'));backtracking(n, 0, path);return result;}
};

52. N 皇后 II

本题和上一题一样只是需要返回结果数

代码如下:

class Solution {
public:int sum = 0; //记录不同解决方案的数量void backtracking(int n, int row, vector<string> path) {//终止条件if (row == n) {sum++;return ;}//单层搜索过程for (int i = 0; i < n; i++) {if (isVaild(i, row, path, n)) {path[row][i] = 'Q';backtracking(n, row + 1, path);path[row][i] = '.';}}}bool isVaild(int col, int row, vector<string>& path, int n) {//检查列for (int i = 0; i < row; i++) {if (path[i][col] == 'Q') return false;}//检查45°角for (int i = col - 1, j = row - 1; i >= 0 && j >= 0; i--, j--) {if (path[j][i] == 'Q') return false;}//检查135°角for (int i = col + 1, j = row - 1; i < n && j >= 0; i++, j--) {if (path[j][i] == 'Q') return false;}return true;}int totalNQueens(int n) {sum = 0;std::vector<std::string> path(n, std::string(n, '.'));backtracking(n, 0, path);return sum;}
};

LeetCode 51. N 皇后、52. N 皇后 II相关推荐

  1. LeetCode 51. N皇后 / 52. N皇后 II(回溯)

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

  2. 51. N皇后/52. N皇后 II

    2020-07-29 1.题目描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 2.题解 回溯算法 3.代码 class Solution {pu ...

  3. LeetCode每日一题 52. N皇后 II

    题目链接 思路 暴搜 二进制 class Solution {public:vector<int> row, col;int totalNQueens(int n) {int ret= 0 ...

  4. LeetCode 52.N皇后II

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

  5. Java实现 LeetCode 52 N皇后 II

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

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

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

  7. LeetCode打卡 52八皇后Ⅱ53最大子序和54螺旋矩阵

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

  8. 日拱一卒——LeetCode 51.N皇后

    ​ 大家好呀,今天是今天为大家带来的LeetCode的题目是LeetCode 51.N皇后问题,算是一道很经典的题目,也是一道难度不低的题目,但是只要我们掌握并理解了判断的逻辑,并且在代码编写上进行注 ...

  9. Leetcode.51. N 皇后

    Leetcode.51. N 皇后 难度:hard 好久没有过hard题目了,还是很开心! 本题的难点在于如何对一个二维数组进行回溯,我们的思路是以chessBoard的行hang为树的每一层,每次递 ...

最新文章

  1. ps -ef 的含义
  2. DELL 向左走 向右走?(二)
  3. Android Studio -添加你见过的最牛Log*神器*
  4. Dapper+SqlServerCe部署
  5. 基于360搜图爬取图片
  6. Jmeter5 语言中文
  7. 学习webpack4 - ES6语法转化
  8. GTK的.NET的函数库 GTK#
  9. 【英语学习】【Level 08】U02 Movie Time L6 Blockbuster
  10. php中json字符串转json对象数组对象,php – 将JSON字符串解析为数组,而不是对象
  11. 玩了一年多电子商务,接触各种品类产品
  12. WINDOWS 下 MYSQLQ全库数据倒出和执行计划加入
  13. 判断服务器是虚拟机还是物理机方式
  14. vue项目 拷到别的电脑应该怎吗再次重新运行
  15. LINUX更改图标后生效
  16. 【三维路径规划】基于matlab人工势场算法无人机三维路径规划【含Matlab源码 168期】
  17. ListView分页显示数据
  18. python抓取下载https://unsplash.com/的图片
  19. elasticsearch2.2之index映射参数的not_analyzed属性
  20. 关于《未来软件是什么样子?》一文的讨论(2)

热门文章

  1. 计算机组成原理三位计数器实验,计算机组成原理位二进制计数器实验报告.doc...
  2. 智能家居:从感知到交互,让生活更美好
  3. C4droid异步调用框架完成初步实现
  4. C语言scanf_s()函数的用法
  5. Atitit 教育与培训学校 的计划策划 v2
  6. 计算机二级能统考免考吗,关于2019年4月统考免考办理的通知
  7. 【数据库】数据库系统概念
  8. 女人怎么去爱自己的男人!!(给女士们看看)声明我是男的 ^_^
  9. eth入门之工作量证明 (POW)
  10. 树莓派3B+ python 实时监控(USB摄像头)并显示