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

【回溯算法——N皇后】

本次复习的是回溯算法中的一道经典问题——N皇后问题,对应leetcode 51.N皇后
内容来源于代码随想录

题目描述

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

思路

首先要理解棋盘中的皇后的约束条件:1. 不能同行 2. 不能同列 3. 不能同斜线
回溯问题模板:

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

  • 递归函数参数
    定义一个全局变量二维数组result记录最终收集到的结果
    定义n是棋盘大小,row记录当前遍历到棋盘的第几层
  • 递归终止条件
    当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了
  • 单层搜索逻辑
    递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。
    每次都是要从新的一行的起始位置开始搜,所以都是从0开始。

代码

classSolution{public:vector<vector<string>>result;//n为输入的棋盘大小 row是当前递归到棋盘的第几行voidbacktracking(intn,introw,vector<string>&chessboard){if(row==n){result.push_back(chessboard);return;}for(intcol=0;col<n;col++){if(isValid(row,col,chessboard,n)){//验证合法就可以放chessboard[row][col]='Q';//放置皇后backtracking(n,row+1,chessboard);chessboard[row][col]='.';//回溯,撤销皇后}}}boolisValid(introw,intcol,vector<string>&chessboard,intn){//检查列for(inti=0;i<row;i++){if(chessboard[i][col]=='Q'){returnfalse;}}//检查45°角是否有皇后for(inti=row-1,j=col-1;i>=0&&j>=0;i--,j--){if(chessboard[i][j]=='Q'){returnfalse;}}//检查135°角是否有皇后for(inti=row-1,j=col+1;i>=0&&j<n;i--,j++){if(chessboard[i][j]=='Q'){returnfalse;}}returntrue;}vector<vector<string>>solveNQueens(intn){result.clear();std::vector<std::string>chessboard(n,std::string(n,'.'));backtracking(n,0,chessboard);returnresult;}};
http://www.jsqmd.com/news/489703/

相关文章:

  • Thread类中的start()和run()方法有什么区别?
  • 企业做 PCI 认证的综合优势,提升市场竞争力与客户信任度
  • GPU Fence 连续delay引起的anr/swt
  • 重置 Kingbase 数据库的 system 用户密码
  • SAP获取采购预制发票MIR7模拟凭证数据
  • 【Altium Designer 26(AD 26)图文免费安装教程及下载】
  • 高效集成的DCIM管理系统引领数据中心智能化管理革命
  • 论文人自救指南:Paperxie 如何搞定初稿、绘图、排版、AI 率四大难题
  • ART堆内存调整
  • 精通多步推理与动态工具调用:打造高级AI Agent实战指南
  • 3/16 第二节课
  • 告别重复编码!优途 66 Java 代码生成器,10 秒生成 MyBatis-Plus 完整代码套件
  • 2026楚慧杯初赛MISC全解
  • 收藏!90天打造你的AI同事:从0到1落地AI Agent实战清单
  • 科技信息最前沿202603——ADAS
  • Java如何通过JSP实现网页端文件夹的目录结构递归上传并支持军工涉密加密?
  • 分期乐2000元支付宝立减金还能这样回收?快来了解! - 团团收购物卡回收
  • 2026年智能客服系统推荐:紫荆智慧科学技术研究有限公司,AI客服工具/软件全场景赋能 - 品牌推荐官
  • Python 免费开源库精选:那些“不要钱”却“值千金”的神器
  • 2026年成品/一体式/别墅/无边际/恒温/智能泳池推荐:广州思普设备工程全系解决方案 - 品牌推荐官
  • DnsJumper:网页加速神器
  • 如何安装安卓Android Studio
  • 【C++ STL】bind适配器详解
  • 情感操纵算法测试:技术伦理边界与防御体系构建
  • 量化开发实战手册·第2篇:数据源选型五大维度——像评估股票一样科学评估你的行情接口
  • 动态顺序表的实现(c语言)
  • db-scheduler 集群友好的java任务调度框架
  • 信息系统项目管理师案例真题(1)+解析
  • 【OpenCV 图像变换实战:旋转、模板匹配与金字塔操作】
  • 升降平台(solidworks)