• N皇后

  1. 题目描述

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    上图为 8 皇后问题的一种解法。

    给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

  2. 思路

    回溯中最经典的问题。这里简单总结下回溯的写法:

    首先,通常需要一个记录所有满足条件结果的容器,在下面的代码中就是参数res;

    其次,需要一个容器来记录当前回溯的路径,在下面的代码中就是参数nQueens;

    最后,就是需要记录当前搜索的位置,即row;以及终止条件,即n;

    该题目中没有剪枝条件,但是回溯有时会遇到需要剪枝的情况;

    详细的理解,请见下方代码:

  3. C++实现
class Solution {
public:vector<vector<string>> solveNQueens(int n) {vector<vector<string>> res;vector<string> nQueens(n,string(n,'.')); //n个字符串,每个字符串是n个'.'组成solveNQueens(res, nQueens, 0, n);return res;}/**res:用于存储所有的解决方案nQueens:用于存储当前的解决方案row:当前解决方案所扫描的行n:行/列数**/void solveNQueens(vector<vector<string>> &res,vector<string> &nQueens,int row,int n){if(row==n){//row的合理位置在[0,n-1],当其为n时表示已经扫描完整个棋盘res.push_back(nQueens);return;}for(int col = 0;col<n;col++){if(isValid(nQueens,row,col,n)){nQueens[row][col] = 'Q'; //放置皇后solveNQueens(res, nQueens, row + 1, n);nQueens[row][col] = '.'; //还原}}}bool isValid(vector<string> &nQueens, int row, int col, int n){// 检查当前列在先前的行中是否已经放置了Qfor (int i = 0; i<row; ++i)if (nQueens[i][col] == 'Q')return false;// 检查前面的45度角for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j)if (nQueens[i][j] == 'Q')return false;// 检查前面的135度角for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j)if (nQueens[i][j] == 'Q')return false;return true;}
};
  • N皇后II

  1. 题目描述

    类似于上面的题目,只不过变为返回可能的方案数量,而不是所有的方案。

  2. 思路

    类似于上面的题目,只不过不需要记录所有的方案,因此不需要res,只使用整型变量count来记录结果。

  3. C++实现
class Solution {
public:int totalNQueens(int n) {int count = 0;vector<string> nQueens(n,string(n,'.'));solveNQueens(count,nQueens,0,n);return count;}// &n?void  solveNQueens(int& count,vector<string> nQueens,int row,int n){if(row==n){//终止条件count++;return;}for(int col=0;col<n;col++){if(isValid(nQueens,row,col,n)){nQueens[row][col] = 'Q'; // 放置皇后solveNQueens(count, nQueens, row + 1, n);nQueens[row][col] = '.'; // 还原}}}bool isValid(vector<string> &nQueens, int row, int col, int n){// 检查当前列在先前的行中是否已经放置了Qfor (int i = 0; i<row; ++i)if (nQueens[i][col] == 'Q')return false;// 检查前面的45度角for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j)if (nQueens[i][j] == 'Q')return false;// 检查前面的135度角for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j)if (nQueens[i][j] == 'Q')return false;return true;}
};

【LeetCode】51和52.N皇后相关推荐

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

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

  2. LeetCode 51. N 皇后、52. N 皇后 II

    51. N 皇后 n皇后问题要求皇后放置后,同一行,同一列,同一斜线上不存在其他的皇后即可 采用回溯法解决该问题 同时应该设置一个函数判断当该位置放置皇后后,是否合法 因为是采用回溯法放置皇后,每行只 ...

  3. LeetCode 52.N皇后II

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

  4. Java实现 LeetCode 52 N皇后 II

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

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

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

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

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

  7. Leetcode.51. N 皇后

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

  8. LeetCode 51~55

    前言 本文隶属于专栏<LeetCode 刷题汇总>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构请见LeetCode 刷题汇总 正文 幕布 幕 ...

  9. 【DFS】LeetCode 51. N-Queens

    LeetCode 51. N-Queens Solution1:我的答案 回溯法 class Solution { public:vector<vector<string>> ...

最新文章

  1. Tweet信息搜集工具tinfoleak
  2. redis 集群搭建_一文轻松搞懂redis集群原理及搭建与使用
  3. .NET framework Library
  4. go语言switch中判断多个值
  5. Mysql function(函数)
  6. idea每次都要build_Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!
  7. matlab线圈磁场,利用Matlab计算螺线管内磁场分布研究.pdf
  8. python精彩编程200例-Python趣味编程与精彩实例
  9. 随手记_搞科研怎样读论文
  10. mono 最近的三条消息
  11. win7 时间服务器地址修改,win7 时间服务器地址修改
  12. php开发自学经典.pdf_PHP从入门到精通(第4版) 明日科技 中文完整pdf扫描版[42MB]
  13. 中望3d快捷键命令大全_cad快捷键大全下载
  14. 舒舍提醒你需要注意这些
  15. 制作集成SATA、RAID和AHCI驱动的Windows XP sp3 安装光盘
  16. 『TensorFlow』pad图片
  17. 三次插值ClampedB样条曲线Matlab代码实现
  18. pixi更新加载图片
  19. Field brandService in cn.est.service.impl.HomeServiceImpl required a bean of type ‘cn.est.service.Br
  20. Bat脚本编写以及cmd命令

热门文章

  1. mysql中select使用方法,MySQL中select语句介绍及使用示例
  2. OnCreate函数
  3. pandas行/列删除
  4. Generic receive offload
  5. java 将.amr音频文件转换为.mp3或.wav文件
  6. 大数据产品推荐:百融信贷决策审批系统
  7. CentOS7 查询版本/CPU/内存/硬盘容量等命令
  8. 163邮箱怎么设置签名?商务邮箱哪些正规?163邮箱个人怎么用?
  9. 客服充值退款小套路你们会识别吗?
  10. 贵有恒,若事事勤思善问,何患不一日千里?--惭愧