目录

  • 题目
  • 思考
  • AC代码

题目

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


思考

首先以N=4为例,画出解空间树的一部分:

根据模板:

void backtracking(参数)
{if(终止条件){存放结果;return;}for(选择:本层集合中元素(树中结点孩子的数量就是集合的大小)){处理结点;backtracking(路径,选择列表);     //递归回溯,撤销处理结果;}
}

1、确定回溯函数参数,返回值
当前所在的行(层),当前的棋盘布局。
N的大小

void backtracking(int hang,vector<string>& chessboard,int n)

全局变量:vector<vector>result;
result是个存放chessboard的变量。
这里的chessboard就相当于之前回溯题目中的path、子结果。
2、确定终止条件:
当遍历到N的最后一层(n-1)时,再往下一层,我们就需要返回了。

if(hang == n)
{result.push_back(chessboard);return ;
}

3、确定单层逻辑
如果本行的某列放入皇后,且不违反规则,即可进入下一行探索

 for(int lie = 0;lie < n ;lie++)
{if(juge_if_valid(hang,lie,chessboard,n) == true){chessboard[hang][lie] = 'Q'; //放置皇后backtracking(hang+1,chessboard,n);chessboard[hang][lie] = '.';    //回溯撤销}}

4、判断是否满足分布条件有三个:

1、皇后不在同一行
2、皇后不在同一列
3、皇后不在同一斜线上

a、同时我们注意,我们探索的时候就是按照深度探索的,所以保证了每一行只有一次赋值Q。所以第一个条件不需要特别处理。
b、由于按照深度往下搜索,所以判断皇后在同一列的时候可以剪枝:

//检查本行之上的行的同一列是否存在Q
for(int i=0;i<hang;i++)
{if(chessboard[i][lie] == 'Q') return false;
}

c、由于按照深度往下探索,所以判断皇后在同一斜线的时候可以剪枝(注意,斜线分为向右上斜和左上斜两个方向)

//检查本行之上的行的右斜线上是否有皇后
for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--)
{if(chessboard[i][j] == 'Q') return false;
}
//检查本行之上的行的左斜线上是否有皇后
for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++)
{if(chessboard[i][j] == 'Q') return false;
}

AC代码

class Solution {public:vector<vector<string>>result;bool juge_if_valid(int hang,int lie,vector<string>&chessboard,int n){//检查本行之上的行的同一列是否存在Qfor(int i=0;i<hang;i++){if(chessboard[i][lie] == 'Q') return false;}//检查本行之上的行的右斜线上是否有皇后for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--){if(chessboard[i][j] == 'Q') return false;}//检查本行之上的行的左斜线上是否有皇后for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++){if(chessboard[i][j] == 'Q') return false;}return true;} void backtracking(int hang,vector<string>& chessboard,int n){if(hang == n){result.push_back(chessboard);return ;}for(int lie = 0;lie < n ;lie++){if(juge_if_valid(hang,lie,chessboard,n) == true){chessboard[hang][lie] = 'Q';  //放置皇后backtracking(hang+1,chessboard,n);chessboard[hang][lie] = '.';    //回溯撤销}}return ;}vector<vector<string>> solveNQueens(int n) {result.clear();//填充初始棋盘vector<string> chessboard(n,string(n,'.'));backtracking(0,chessboard,n);return result;}
};

leetcode 51. N 皇后 思考分析相关推荐

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

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

  2. leetcode 322. 零钱兑换 思考分析

    目录 1.题目 2.思路分析 3.参考链接 1.题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...

  3. leetcode 47. 全排列 II 思考分析

    题目 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 思考分析以及代码 这一题和前面的做过的两个题目有所关联: leetcode 46. 全排列 思考分析 再加上lee ...

  4. leetcode 491. 递增子序列 思考分析

    题目 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 说明: 给定数组的长度不会超过15. 数组中的整数范围是 [-100,100]. 给定数组中可能包含重复数字 ...

  5. leetcode 617. 合并二叉树 思考分析

    题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否 ...

  6. Leetcode.51. N 皇后

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

  7. leetcode 90. 子集 II 思考分析

    与本题相关联的题目解析: leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集 ...

  8. LeetCode 101. 对称二叉树 思考分析

    题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / 2 2 / \ / 3 4 4 3 但是下面这个 [1,2,2,null,3,null ...

  9. leetcode 202. 快乐数 思考分析(哈希集合与双指针解)

    1.题目 编写一个算法来判断一个数 n 是不是快乐数. 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变 ...

最新文章

  1. 月薪30K+的程序员都会啥,通过3000字告诉你……
  2. 【TPAMI2022】关联关系驱动的多模态分类
  3. case 语句不跳转,死循环
  4. 云计算情报局预告|告别 Kafka Streams,让轻量级流处理更加简单
  5. Vysor_v1.6.9
  6. 学习 MySQL中导入 导出CSV
  7. 计算机网络中TCP属于,【填空题】TCP/IP协议将计算机网络的结构划分为应用层、传输层、网络互连层等4个层次,其中IP协议属于【1】层。...
  8. 利用大数据构建用户画像的好处
  9. Failed installing ‘Tomcat8‘ service?
  10. 南方cass10.1中文版
  11. 最新最全的云开发入门教程,微信小程序云开发,云函数,云数据库学习,微信小程序云开发扩展功能学习
  12. maccms-cve_2017_17733漏洞复现
  13. [ERR] 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘
  14. JQuery日历 日期选择
  15. python re.sub和lambda_【python学习笔记】 re.sub()
  16. 物流手持PDA,无线巴枪
  17. 跟我学c++初级篇——别名的使用
  18. loss.backward(),scheduler(), optimizer.step()的作用
  19. 我要的精致:人间有茶是清欢
  20. 桔子菌和楼下超市田大爷的角色互换经历–Python做的商品价格语音播报器

热门文章

  1. 摇杆控制方向原理_图文全面讲解多种方向控制阀的原理和区别....
  2. 教你玩转CSS 导航栏
  3. java光标移动函数_文件内光标的移动 函数基础 定义函数的三种形式 函数的返回值 调用方式...
  4. android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)
  5. EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  6. 如何用纯 CSS 创作一个冒着热气的咖啡杯
  7. UI设计师必知:link和@import引用css文件方法的区别
  8. @font-face 用字体画图标
  9. 前端经典面试题 不经典不要star!
  10. CSS基础学习-15-1.CSS 浏览器内核