当前位置: 首页 > news >正文

第三十天| 51. N皇后

Leetcode 51. N皇后

题目链接:51 N皇后

题干:按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

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

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

思考:回溯法。先定义结果集result,再考虑回溯函数:

函数参数含义
参数含义
n题目给定皇后个数
chessboard当前棋盘摆放情况
row当前处理行数

 终止条件:如果当前处理行数row等于n时说明皇后已全部摆放完毕,将当前棋盘摆放情况chessboard存放到结果集result中。

单层搜索逻辑:从下标0开始循环处理每个二维坐标位置,若当前行row当前列col存放皇后合法则摆放皇后,递归处理,最后回溯。

验证row行col列摆放皇后合法性:参数当前行列值,当前棋盘以及皇后个数。三处标准判断合法性:不能同行(每次处理都是不同行故此标准不用验证)、不能同列、不能同斜线 (45度和135度角)。

  • 判断同列:当前row行前面的所以行对应的col列是否摆放过皇后
  • 判断45°线:当前row行col列45°斜方向是否摆放过皇后
  • 判断135°线:当前row行col列135°斜方向是否摆放过皇后

代码:

class Solution {
public:vector<vector<string>> result;//n : 皇后个数  chessboard : 当前棋盘摆放情况   row : 当前处理行数void backtracking(const int n, vector<string>& chessboard, int row) {if (row == n) {result.push_back(chessboard);return;}for (int col = 0; col < n; col++) {if (isValid(n, chessboard, row, col)) {chessboard[row][col] = 'Q';     //摆放皇后backtracking(n, chessboard, row + 1);chessboard[row][col] = '.';     //回溯}}}//判断row行col列摆放皇后是否合法bool isValid(const int n, vector<string>& chessboard, int row, int col) {//检查此行是否摆放过皇后for (int i = 0; i < row; i++)       if (chessboard[i][col] == 'Q')return false;//检查45°线是否摆放过皇后for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)      if (chessboard[i][j] == 'Q')return false;//检查135°线是否摆放过皇后for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)if (chessboard[i][j] == 'Q')return false;return true;}vector<vector<string>> solveNQueens(int n) {result.clear();vector<string> chessboard(n, string(n, '.'));backtracking(n, chessboard, 0);return result;}
};

回溯法专题总结:

  •  熟悉回溯法代码整体框架。把回溯问题抽象为树形结构,其搜索的过程:for循环横向遍历,递归纵向遍历,回溯不断调整结果集。
  • 确定是否使用startIndex。对于组合问题,如果是一个集合来求组合的话,就需要startIndex;如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex。
  • 熟悉同层去重两种方式。排序后相邻元素比较以及set容器记录使用情况。了解到节点去重,但未归纳。
  • 明确在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果。
http://www.lryc.cn/news/297049.html

相关文章:

  • pythn-scipy 查漏补缺
  • 【JavaScript 漫游】【013】Date 对象知识点摘录
  • vue.config.js和webpack.config.js区别
  • H12-821_73
  • postman执行批量测试
  • 蓝桥杯基础知识8 list
  • 【DDD】学习笔记-理解领域模型
  • v-if 和v-show 的区别
  • LabVIEW网络测控系统
  • 攻防世界 CTF Web方向 引导模式-难度1 —— 11-20题 wp精讲
  • 华为Eth-Trunk级联堆叠接入IPTV网络部署案例
  • idea: 无法创建Java Class文件(SpringBoot)已解决
  • ChinaXiv:中科院科技论文预发布平台
  • 【人工智能】Fine-tuning 微调:解析深度学习中的利器(7)
  • 黄金交易策略(Nerve Nnife):大K线对技术指标的影响
  • django中实现数据迁移
  • 全新抖音快手小红书去水印系统网站源码 | 支持几十种平台
  • ChatGPT炸裂了
  • 小白代码审计入门
  • [开源]GPT Boss – 用图形化的方式部署您的私人GPT镜像网站
  • FastAPI使用ORJSONResponse作为默认的响应类型
  • C++初阶:适合新手的手撕string类(模拟实现string类)
  • uniapp canvas游标卡尺效果
  • 【django】建立python虚拟环境-20240205
  • 070:vue+cesium: 利用canvas设置线性渐变色材质
  • Electron+Vue实现仿网易云音乐实战
  • 【玩转408数据结构】线性表——定义和基本操作
  • 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测
  • SQL笔记-2024/01/31
  • C#系列-简介(1)