递归搜索回溯相关的题目解析和练习2

前言

大家好,我是jiantaoyab,下面的题目用的方法和前面几篇的方法是一样的,写起来是比较困难的,加油

字母大小写全排列

https://leetcode.cn/problems/letter-case-permutation/

解析

image-20240309084013893

代码

class Solution {vector<string> ret;string path;
public:char change(char ch){return (ch >= 'a' && ch <= 'z') ? ch -= 32 : ch += 32;}void dfs(string s, int pos){if(pos == s.size()){ret.push_back(path);return;}//不改变char ch = s[pos];path.push_back(ch);dfs(s, pos + 1);path.pop_back();//改变if(ch > '9' || ch < '0'){char tmp = change(ch);path.push_back(tmp);dfs(s, pos + 1);path.pop_back();}}vector<string> letterCasePermutation(string s) {dfs(s, 0);return ret;}
};

N 皇后

https://leetcode.cn/problems/n-queens/

解析

image-20240309101729026

代码

class Solution {bool check_col[10]; //判断同一列有没有出现过bool dig1[20]; //判断主对角线有没有出现过bool dig2[20]; //判断副对角线有没有出现过vector<string> path;vector<vector<string>> ret;
public:void dfs(int n, int row){if(path.size() == row){ret.push_back(path);return;}for(int col = 0; col < n; col++) //尝试在这一行放皇后{if(!check_col[col] && !dig1[row - col + n] && !dig2[row + col]){path[row][col] = 'Q';check_col[col] = dig1[row - col + n] = dig2[row + col] = true;dfs(n, row + 1);path[row][col] = '.';check_col[col] = dig1[row - col + n] = dig2[row + col] = false;}}}vector<vector<string>> solveNQueens(int n) {path.resize(n);for(int i = 0; i < n; i++)path[i].append(n, '.'); //默认给n*n的棋盘都给上一个'.'dfs(n, 0);return ret;}
};

优美的排列

https://leetcode.cn/problems/beautiful-arrangement/

解析

若整数a除以非零整数b,商为整数,且没有余数, 我们就说a能被b整除(或说 b能整除a)

image-20240309092255197

代码

这道题目也是用排列的方法去做的
class Solution {bool check[16];int ret;
public:void dfs(int pos, int n){if(pos == n + 1) {ret++;return;}for(int i = 1; i <= n; i ++) //数组{if(check[i] == false && (pos % i == 0 || i % pos == 0)){check[i] = true;dfs(pos + 1, n);check[i] = false;}       }}int countArrangement(int n) {dfs(1, n);return ret;}
};

有效的数独

https://leetcode.cn/problems/valid-sudoku/

解析

image-20240310090825668

代码

class Solution {bool check_row[9][10];bool check_col[9][10];bool check_gird[3][3][10];
public:bool isValidSudoku(vector<vector<char>>& board) {for(int i = 0; i < 9; i++){for(int j = 0; j < 9; j++){if(board[i][j] != '.'){int num = board[i][j] - '0';//判断数字是不是合法if(check_row[i][num] || check_col[j][num] || check_gird[i / 3][j / 3][num])                     {return false;}check_row[i][num] = check_col[j][num] = check_gird[i / 3][j / 3][num]  = true;}}}return true;}
};

解数独

https://leetcode.cn/problems/sudoku-solver/

解析

image-20240310094638331

代码

class Solution {bool check_row[9][10];bool check_col[9][10];bool check_gird[3][3][10];
public:bool dfs(vector<vector<char>>& board){for(int i = 0; i < 9; i++){for(int j = 0; j < 9; j++){if(board[i][j] == '.'){//开始从 1 - 9 一个个试for(int num = 1; num <= 9; num++){if( !check_row[i][num] && !check_col[j][num] && !check_gird[i / 3][j / 						3][num]){board[i][j] = num + '0';check_row[i][num] = check_col[j][num] = check_gird[i / 3][j / 3]							[num] = true;if(dfs(board) == true) return true; //说明这一行填满了,能到下一行去填//恢复board[i][j] = '.';check_row[i][num] = check_col[j][num] = check_gird[i / 3][j / 3]								[num] = false;}}//走到这里说明 1 - 9 都试过了都不行,那这种方法就不用了return false;}}}return true;}void solveSudoku(vector<vector<char>>& board) {//开始的时候先将已经有的数字搞成truefor(int i = 0; i < 9; i++){for(int j = 0; j < 9; j++){if(board[i][j] != '.'){int num = board[i][j] - '0';check_row[i][num] = check_col[j][num] = check_gird[i / 3][j / 3][num] = 																				true;}}}//填数独dfs(board);}
};

单词搜索(向量偏移)

https://leetcode.cn/problems/word-search/

解析

image-20240310105842109

image-20240310112240645

代码

class Solution {bool check[7][7];int m, n;
public://偏移量数组int dx[4] = {0,  0, 1, -1};int dy[4] = {-1, 1, 0, 0};bool dfs(vector<vector<char>>& board,string& word, int i, int j, int pos){if(pos == word.size()) return true;for(int d = 0; d < 4; d++){int x = i + dx[d], y = j + dy[d];if(  (x >= 0 && x < m)  &&  (y >= 0 && y < n)  && !check[x][y] && board[x][y] == word[pos] ){check[x][y] = true;if(dfs(board, word, x, y, pos + 1) == true) return true;check[x][y] = false;}}//前后左右都没有,返回faslereturn false;}bool exist(vector<vector<char>>& board, string word) {m = board.size();n = board[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(board[i][j] == word[0]){check[i][j] = true;if(dfs(board, word, i, j, 1) == true) return true;check[i][j] = false;}}}return false;}
};

黄金矿工

https://leetcode.cn/problems/path-with-maximum-gold/

和上面的单词搜索的题目解法是一样的

代码

class Solution {bool check[16][16];int m, n;int ret = 0;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:void dfs(vector<vector<int>>& grid, int i, int j, int path){ret = max(ret, path);for(int d = 0; d < 4; d++){int x = i + dx[d], y = j + dy[d];if((x >= 0 && x < m) && (y >= 0 && y < n) && !check[x][y] && grid[x][y]){check[x][y] = true;dfs(grid, x, y, grid[x][y] + path);check[x][y] = false;}}} int getMaximumGold(vector<vector<int>>& grid) {m = grid.size();n = grid[0].size();for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){if(grid[i][j]){check[i][j] = true;dfs(grid, i, j, grid[i][j]);check[i][j] = false;}}}return ret;}
};

不同路径 III

https://leetcode.cn/problems/unique-paths-iii/

解析

image-20240310144440828

代码

class Solution {bool check[15][15];int n, m, ret = 0;int step = 0;int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};
public:void dfs(vector<vector<int>>& grid, int i, int j, int count){//到了终点if(grid[i][j] == 2){if(count == step) //路径合法{ret++;}return;}for(int d = 0; d < 4; d++){int x = i + dx[d], y = j + dy[d];if((x >= 0 && x < m) && (y >= 0 && y < n) && !check[x][y] && grid[x][y] != -1){check[x][y] = true;dfs(grid, x, y, count + 1);check[x][y] = false;}}}int uniquePathsIII(vector<vector<int>>& grid) {m = grid.size();n = grid[0].size();int begin_x,begin_y;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == 0) step++;else if(grid[i][j] == 1){begin_x = i;begin_y = j;}}}step += 2; //把起点和终点也加上check[begin_x][begin_y] = true;dfs(grid, begin_x, begin_y, 1); //从这里开始计数为1return ret;}
};

括号生成

https://leetcode.cn/problems/IDBivT/

解析

有效挂号

  • 左边挂号数目 = 右边挂号数目
  • 递归到当前节点的时候,左边括号数 >= 右边括号数

image-20240308083419642

代码

class Solution {vector<string> ret;string path;
public:void dfs(int left, int right, int n){if(right == n){ret.push_back(path);return;}//不满足这2个if的都被剪掉了if(left < n){//选(path += '(';left ++;dfs(left, right, n);path.pop_back();left--;}if(right < left){path += ')';right++ ;dfs(left, right, n);path.pop_back();right--;}}vector<string> generateParenthesis(int n) {dfs(0, 0, n);return ret;}
};

组合

https://leetcode.cn/problems/combinations/

解析

image-20240308094035210

代码

class Solution {vector<int> path;vector<vector<int>> ret;
public://pos用来表示下一次就从下一个位置直接开始,达到去重的目的void dfs(int n, int k, int pos){if(path.size() == k){ret.push_back(path);return;}for(int i = pos; i <= n; i++){   path.push_back(i);dfs(n, k, i + 1);path.pop_back();      }}vector<vector<int>> combine(int n, int k) {dfs(n ,k, 1);return ret;}
};

目标和

https://leetcode.cn/problems/target-sum/

代码

这里sum用作为参数的方式去递归,sum + nums[pos] 等调用完回来的值还是sum原来的值

class Solution {int ret = 0;
public:void dfs(vector<int>& nums, int target, int pos, int sum){if(pos == nums.size()){if(sum == target){ret++;       }return;}//选正dfs(nums, target, pos + 1, sum + nums[pos]);//选负dfs(nums, target, pos + 1, sum - nums[pos]);}int findTargetSumWays(vector<int>& nums, int target) {dfs(nums, target, 0, 0);return ret;}
};

组合总和

https://leetcode.cn/problems/combination-sum/

解析

image-20240308112226002

代码

class Solution {vector<vector<int>> ret;vector<int> path;
public:void dfs(vector<int>& candidates, int target, int pos, int sum){if(sum == target){ret.push_back(path);return ;}if(sum > target || pos == candidates.size()) return;for(int i = pos; i < candidates.size(); i++){path.push_back(candidates[i]);dfs(candidates, target, i, sum + candidates[i]);path.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {dfs(candidates, target, 0, 0);return ret;}
};

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

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

相关文章

【Docker】容器的概念

容器技术&#xff1a;容器技术是基于虚拟化技术的&#xff0c;它使应用程序从一个计算机环境快速可靠地转移到另一个计算机环境中&#xff0c;可以说是一个新型地虚拟化技术。 一、docker容器 Docker:是一个开源地容器引擎Docker 是一种轻量级的容器化技术&#xff0c;其主要原…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址&#xff1a;https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下&#xff1a; 网络的原理还是比较简单的&#xff0c; 编码分支用的是预训练的resnet模块&#xff0c;解码分支则重新设计了。…

PyTorch搭建LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

微信小程序(五十二)开屏页面效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.使用控件模拟开屏界面 2.倒计时逻辑 3.布局方法 4.TabBar隐藏复现 源码&#xff1a; components/openPage/openPage.wxml <view class"openPage-box"><image src"{{imagePath}}"…

三维不同坐标系下点位姿态旋转平移变换

文章目录 前言正文计算方法思路Python实现总结前言 本文主要说明以下几种场景3D变换的应用: 3D相机坐标系下长方体物体,有本身坐标系,沿该物体长边方向移动一段距离,并绕长边轴正旋转方向转90度,求解当前物体中心点在相机坐标系下的位置和姿态多关节机器人末端沿工具坐标…

STM32 利用FlashDB库实现在线扇区数据管理不丢失

STM32 利用FlashDB库实现在线扇区数据管理不丢失 &#x1f4cd;FalshDB地址:https://gitee.com/Armink/FlashDB ✨STM32没有片内EEPROM这样的存储区&#xff0c;虽然有备份寄存器&#xff0c;仅可以实现对少量数据的频繁存储&#xff0c;但是依赖备份电源&#xff08;BAT引脚&a…

美国签证|附面签相关事项√

小伙伴最近都忙着办签证吧&#xff01;但是需要注意的是&#xff0c;美国的签证跟其他任何国家的签证不同&#xff0c;并不是办理了就一定拿得到&#xff0c;据说概率是50%左右。所以办理美国签证&#xff0c;不要太着急啦&#xff01;先来了解一下美国签证的相片该怎么拍叭 ✅…

RocketMQ的事务消息流程

什么是事务消息&#xff1f; 事务消息是一种在发送方和接收方之间保证消息传递的一致性和可靠性的消息传递机制。在消息发送过程中&#xff0c;生产者可以将消息发送到消息队列&#xff0c;但不会立即被消费者接收和处理。相反&#xff0c;消息会先进入一种“准备”状态&#x…

用chatgpt写insar地质灾害的论文,重复率只有1.8%,chatgpt4.0写论文不是梦

突发奇想&#xff0c;想用chatgpt写一篇论文&#xff0c;并看看查重率&#xff0c;结果很惊艳&#xff0c;说明是确实可行的&#xff0c;请看下图。 下面是完整的文字内容。 InSAR (Interferometric Synthetic Aperture Radar) 地质灾害监测技术是一种基于合成孔径雷达…

【JavaScript】JavaScript 变量 ① ( JavaScript 变量概念 | 变量声明 | 变量类型 | 变量初始化 | ES6 简介 )

文章目录 一、JavaScript 变量1、变量概念2、变量声明3、ES6 简介4、变量类型5、变量初始化 二、JavaScript 变量示例1、代码示例2、展示效果 一、JavaScript 变量 1、变量概念 JavaScript 变量 是用于 存储数据 的 容器 , 通过 变量名称 , 可以 获取 / 修改 变量 中的数据 ; …

第十五届蓝桥杯模拟赛(第三期)

大家好&#xff0c;我是晴天学长&#xff0c;本次分享&#xff0c;制作不易&#xff0c;本次题解只用于学习用途&#xff0c;如果有考试需要的小伙伴请考完试再来看题解进行学习&#xff0c;需要的小伙伴可以点赞关注评论一波哦&#xff01;蓝桥杯省赛就要开始了&#xff0c;祝…

【DimPlot】【FeaturePlot】使用小tips

目录 DimPlot函数参数解析 栅格化点图 放大 ggplot2 图例的点&#xff0c;修改图例的标题 FeaturePlot函数参数解析 调整FeaturePlot颜色 分组绘制featureplot 随手笔记&#xff0c;持续更新中。。。 Reference DimPlot函数参数解析 object: 一个Seurat对象&#xff0c;…

工作纪实46-关于微服务的上线发布姿势

蓝绿部署 在部署时&#xff0c;不需要将旧版本的服务停掉&#xff0c;而是将新版本与旧版本同时运行&#xff0c;新版本测试无误之后再将旧版本停掉。这样可以避免再升级的过程中如果失败服务不可用的问题&#xff0c;因为同时部署了两个版本的程序&#xff0c;使得硬件资源是…

【项目笔记】java微服务:黑马头条(day01)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)课程对比2)项目概述2.1)能让你收获什么2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备4.2)nacos安装 5)初始工程搭建5.1)环境准备5.2)主体结构 6)登录6.1…

JavaScript中的Set和Map:理解与使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C++:类和对象(三)——拷贝构造函数和运算符重载

目录 一、拷贝构造函数 1.概念 2.特性 二、赋值运算符重载 1.运算符重载 2.赋值运算符重载 &#xff08;1&#xff09;注意的点&#xff1a; &#xff08;2&#xff09;赋值运算符不允许被重载为全局函数&#xff0c;只能重载为类的成员函数 &#xff08;3&#xff09;…

C++ 字符串OJ

目录 1、14. 最长公共前缀 2、 5. 最长回文子串 3、 67. 二进制求和 4、43. 字符串相乘 1、14. 最长公共前缀 思路一&#xff1a;两两字符串进行比较&#xff0c;每次比较过程相同&#xff0c;可以添加一个函数辅助比较&#xff0c;查找最长公共前缀。 class Solution { pu…

【C++】函数模板和类模板

目录 1.泛型编程 2.函数模板 2.1函数模板的定义格式 2.2函数模板的实例化 2.3函数模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 3.3模板的分离编译 1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段…

【前端CSS】CSS的3种基本选择器和5种高级选择器使用方式

目录 前言 基本选择器 1.1 标签选择器 1.2 ID选择器 1.3 类选择器 高级选择器 2.1 并集选择器 2.2 交集选择器 2.3 后代选择器 2.4 子元素选择器 2.5 属性选择器 前言 1W&#xff1a;什么是CSS选择器&#xff1f; CSS选择器由HTML元素的id、class属性或元素名本身以及…