代码随想录训练营day30

第七章 回溯算法part06

1.LeetCode.重新安排行程

先跳过

1.1题目链接:

文章讲解:代码随想录

1.2思路:

1.3附加代码如下所示:

2.LeetCode. N皇后

2.1题目链接:

文章讲解:代码随想录
视频讲解:

2.2思路:都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二维矩阵还会有点不知所措。

首先来看一下皇后们的约束条件:

不能同行
不能同列
不能同斜线
确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。
下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图:
在这里插入图片描述

2.3附加代码如下所示:

class Solution {
public:vector<vector<string>>result;// n 为输入的棋盘大小// row 是当前递归到棋盘的第几行了void backtracking(int n,int row,vector<string>&chessboard){if(row==n){result.push_back(chessboard);return;}for(int col=0;col<n;col++){if(isValid(row,col,chessboard,n))// 验证合法就可以放{chessboard[row][col]='Q';// 放置皇后backtracking(n,row+1,chessboard);chessboard[row][col]='.';//回溯,撤销皇后}}}bool isValid(int row,int col,vector<string>&chessboard,int n){//检查列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,'.'));std::vector<std::string> chessboard(n, std::string(n, '.'));//这是使用标准库函数中的vectorbacktracking(n,0,chessboard);return result;}
};

3.LeetCode.解数独

3.1题目链接:

文章讲解:代码随想录
视频讲解:

3.2思路:N皇后问题是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。本题就不一样了,本题中棋盘的每一个位置都要放一个数字(而N皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深。

3.3附加代码如下所示:

class Solution {
public:bool backtracking(vector<vector<char>>&board){for(int i=0;i<board.size();i++) // 遍历行{for(int j=0;j<board[0].size();j++) // 遍历列{if(board[i][j]=='.'){for(char k='1';k<='9';k++)// (i, j) 这个位置放k是否合适{if(isValid(i,j,k,board)){board[i][j]=k; // 放置kif(backtracking(board))return true;// 如果找到合适一组立刻返回board[i][j]='.'; // 回溯,撤销k}}return false; // 9个数都试完了,都不行,那么就返回false}}}return true;}bool isValid(int row,int col,char val,vector<vector<char>>&board){for(int i=0;i<9;i++){if(board[row][i]==val){return false;}}for(int j=0;j<9;j++){if(board[j][col]==val){return false;}}int startrow=(row/3)*3;int startcol=(col/3)*3;for(int i=startrow;i<startrow+3;i++){for(int j=startcol;j<startcol+3;j++){if(board[i][j]==val){return false;}}}return true;}void solveSudoku(vector<vector<char>>& board) {backtracking(board);}
};

4.回溯算法总结

代码随想录
**总结:**回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。

回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。

回溯算法能解决如下问题:

组合问题:N个数里面按一定规则找出k个数的集合
排列问题:N个数按一定规则全排列,有几种排列方式
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
棋盘问题:N皇后,解数独等等

回溯法的模板:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601245.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter 获取验证码倒计时组件封装

send_sms_btn.dart import dart:async;import package:flutter/material.dart; import package:get/get.dart;// 发送验证码 按钮 class SendSmsBtn extends StatefulWidget {final Future<bool> Function()? onTap;const SendSmsBtn({super.key,this.onTap,});overrid…

Mysql底层原理六:InnoDB 数据页结构

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1&#xff09;建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

P1123 取数游戏(dfs算法)

题目描述 一个 NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求取出数字和最大是多少。 输入格式 第…

ElementUI使用问题记录:设置路由+iconfont图标+自定义表单验证

一、关于导航怎么设置路由 1、在el-menu这个标签的属性中添加 router ,官方文档的解释是&#xff1a;启用vue-router 这种模式 2、在el-menu-item标签中的index属性直接书写路由&#xff0c;就可以实现正常vue-router了 3、在el-menu-item标签中书写路由属性&#xff1a;:route…

新一代最强开源UI自动化测试神器Playwright(Java版)(对话框处理)

&#x1f3ad;Playwright让网页对话框&#x1f310;&#x1f4ac;处理变得更加快捷&#xff01;网页对话框是在网页上出现的常见弹窗&#xff0c;包括Alert、Confirm和Prompt等。这些对话框通常需要用户输入信息或进行某些选择&#xff0c;但是在自动化测试中处理它们可能会很棘…

xhci 数据结构

xhci 数据结构 xhci 数据结构主要在手册上有详细的定义&#xff0c;本文根据手册进行归纳总结&#xff1a; 中断关注的包括&#xff1a; device contexttrb ringtrb device context设备上下文 设备上下文数据结构由xHC管理&#xff0c;用于向系统软件报告设备配置和状态信息。…

用动态IP采集数据总是掉线是为什么?该怎么解决?

动态IP可以说是做爬虫、采集数据、搜集热门商品信息中必备的代理工具&#xff0c;但在爬虫的使用中&#xff0c;总是会遇到动态IP掉线的情况&#xff0c;从而影响使用效率&#xff0c;本文将探讨动态IP代理掉线的几种常见原因&#xff0c;并提供解决方法&#xff0c;以帮助大家…

Kubernetes有状态任务

有状态任务是指执行期间需要维护一定状态或数据的任务或工作。这些任务通常需要记录并维护数据、状态、上下文或进度信息&#xff0c;并且这些信息在任务执行期间保持持久。有状态任务的解决目标是确保任务在不同的环境、节点或时间点之间维持一致的状态和标识。这种任务通常需…

电商技术揭秘十二:云计算在电商中的应用场景

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

【LeetCode笔记】巧妙写出二叉树前中后序遍历

忘记是在哪里看到的了&#xff0c;有一种画图的办法可以巧妙写出二叉树前中后序遍历。 一条根本原则&#xff1a;一根线从二叉树的根的左部不间断地画到根的右部&#xff0c;要绕整个二叉树一圈。 前序遍历&#xff0c;就让每个节点拥有一个左侧的“句柄”&#xff1b; 中序遍历…

代码随想录|Day34|动态规划03|343.整数拆分、96.不同的二叉搜索树

343.整数拆分 动规五步&#xff1a; 确定 dp[i] 含义&#xff1a;拆分数字 i&#xff0c;可以获得的最大乘积为 dp[i]。递推公式&#xff1a;dp[i] max(j * (i - j), j * dp[i - j])。i 可以被拆解为两个数&#xff08;j 和 i - j&#xff09;或者多个数&#xff08;j 和 dp[i…

苍穹外卖Day10——总结10

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://blog.csdn.net/qq_43751200/article/details/1363…