数据结构算法-回溯算法

引言

在原神的世界中,小森决定挑战自我,踏上了寻找风神的迷宫——风之迷宫。这个迷宫就像是一个巨大的电玩城,让小森感到困惑和无助。他站在迷宫的入口,看着眼前乱糟糟的路径,内心充满了不安和焦虑。

“派蒙,我… 我真的不知道该怎么办了。”小森向他的老朋友派蒙诉说。

派蒙看着小森愁眉苦脸的样子,笑着说:“别担心,小森,我们可以利用深度优先搜索来寻找路径。这个算法超级强大,它会帮助我们找到一条通往风神的正确道路。”

小森听后有些疑惑,他挠了挠头,瞪大了眼睛问:“深度优先搜索?那是什么?听起来好像很高级的样子。”

派蒙笑着回答:“哈哈,别担心,小森,其实它就像是你吃蛋糕一样。我们从蛋糕的顶部开始,一口一口地吃下去,直到吃到下面为止。这就是深度优先搜索!”

小森听后恍然大悟,“哦!我明白了!就像我们在森林里迷路一样,我们要一直往下走,直到找到出口为止!”

派蒙点点头,“没错,就是这个意思。”

正当他们谈话时,另一位神秘人物小坤出现了。小坤看着小森和派蒙焦虑的样子,笑着说:“你们不必担心迷宫中的路径,我可以给你们提供一种回溯算法,这种算法可以帮助你们在迷宫中寻找路径。回溯算法就像是你走迷宫一样,如果发现走不通,就会原路返回,换一条路继续前进。”

小坤的话让小森和派蒙感到非常安心。他们决定按照小坤的指引行动。在接下来的冒险中,他们分工合作,派蒙利用深度优先搜索算法不断探索迷宫中的路径,而小坤则根据回溯算法不断调整搜索方向,引导他们找到正确的路径。

在探索的过程中,小森想起自己的冒险经历,“派蒙,你说我们会不会像以前一样遇到很多困难呢?”

派蒙看着他,“哈哈,难说呢,小森。但是我们可以抱着乐观的态度去面对。就像以前一样,遇到困难我们就一起解决。”

小森握紧拳头,“好!我相信我们一定能够成功找到风神!”

每当他们遇到困难时,他们都会相互鼓励、互相扶持着继续前进。小坤的回溯算法总是能在关键时刻指引他们走向正确的方向。

通过不断地尝试和探索,他们终于在字符矩阵中找到了通往风神的路径。在这个过程中,他们不仅学会了如何利用深度优先搜索和回溯算法来解决问题,还进一步理解了风神的哲学理念。

最终,当他们站在风神的面前时,小森感慨万分。他向派蒙表示感激:“谢谢你派蒙,如果不是你一直在我身边支持和鼓励我,我可能早就放弃了。”

派蒙笑着回答:“哈哈,别客气,小森!我们是朋友嘛!而且这个冒险旅程也让我学到了很多。”

回溯算法核心思想

回溯:尝试解决问题若某个位置卡着,就回退到那个位置,继续解决计算位置并且确实走那个位置

  1. 利用深度优先搜索算法不停段的搜索问题
  2. 若问题有障碍 就回溯到上一个子问题
  3. 直到解决问题的解
  4. 在此之上必须定义搜索问题的空间 (防止重复计算)

动态规划算法实现思路

如上所说(引言里) 在字符矩阵里找到包含指定的字符串的路径是否出租

在这里插入图片描述
如图 可以看出这搜索的路径 由左上右下策略 走这么一个路径 若都走不动,则回溯并重置路径长度和标记当前字符为未访问过状态,以便其他路径可以继续尝试访问当前字符
虽然说采用递归的方式比较绕 ,但没有必要把 每一个执行的步骤都要做到非常清楚 若是这样动脑能力都没有一点学这个 有啥意思 至于我嘛大概了解 即可没必要死磕 画这个的时候,我需要彻底掌握? 当然需要,但舍近求远 毕竟后面的内容更加精彩 技术更迭 是程序员必备技能

回溯应用算法专区

// 查找字符矩阵中子字符串的路径,返回是否存在路径  
bool FindCharMatrixSubstrPath(const char* matrix, int rows, int cols, const char* str) {  // 初始化返回值  bool ret = false;  // 检查输入矩阵和字符串是否有效,并且行数和列数是否大于1  if (matrix != nullptr && rows > 1 && cols > 1 && str != nullptr) {  // 初始化访问数组,用于标记已访问的字符  bool* visited = new bool[rows * cols] {};  // 初始化路径长度为0  int Pathlen = 0;  // 遍历矩阵的每个字符  for (size_t row = 0; row < rows; row++) {  for (size_t col = 0; col < cols; col++) {  // 检查下一个字符是否在字符矩阵路径中  if (CheckNextCharisCharMatrixPath(matrix, rows, cols, row, col, str, Pathlen, visited)) {  // 如果找到路径,则设置返回值为true  ret = true;  // 终止函数执行,并释放访问数组内存  delete[] visited;  // 跳出内层循环,继续查找是否有其他路径  break;  }  }  if (ret){  // 如果找到路径,则跳出外层循环,不再继续遍历矩阵  break;  }  }  }  // 返回是否存在路径的结果  return ret;  
}  // 检查下一个字符是否在字符矩阵路径中,返回是否找到路径的结果  
bool CheckNextCharisCharMatrixPath(const char* matrix, int rows, int cols, int row, int col, const char* str, int& Pathlen, bool* visited){  // 如果字符串已经遍历完,则返回找到路径的结果  if (str[Pathlen]=='\0'){  return true;  }  // 初始化是否找到路径的标志为false  bool isPath = false;;  // 检查当前字符的坐标是否在矩阵范围内  bool CheckRange = row >= 0 && row < rows && col >= 0 && col < cols;  // 计算当前字符在矩阵中的索引位置  int matrixIndex = row * cols + col;  // 检查当前字符是否与字符串中的字符匹配  bool CheckStr = matrix[matrixIndex] == str[Pathlen];  // 如果坐标在矩阵范围内,字符匹配且未被访问过,则进行递归调用,检查上下左右四个方向是否可以找到路径  if (CheckRange && CheckStr &&!visited[matrixIndex])	{  // 更新路径长度并标记当前字符已访问过  Pathlen++;  visited[matrixIndex] = true;  // 分别检查四个方向是否可以找到路径,任意一个方向可以找到路径,则设置isPath为true,否则回溯并重置路径长度和标记当前字符为未访问过状态  isPath = CheckNextCharisCharMatrixPath(matrix, rows, cols, row , col-1, str, Pathlen, visited) ||   CheckNextCharisCharMatrixPath(matrix, rows, cols, row -1, col, str, Pathlen, visited) ||   CheckNextCharisCharMatrixPath(matrix, rows, cols, row, col + 1, str, Pathlen, visited) ||   CheckNextCharisCharMatrixPath(matrix, rows, cols, row+1, col , str, Pathlen, visited);  if (!isPath){  // 如果四个方向都没有找到路径,则回溯并重置路径长度和标记当前字符为未访问过状态,以便其他路径可以继续尝试访问当前字符  Pathlen--;  visited[matrixIndex] = false;  }  }  // 返回是否找到路径的结果  return isPath;  

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

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

相关文章

【GO】项目import第三方的依赖包

目录 一、导入第三方包 1.执行命令 2.查看go环境变量参数 3.查看go.mod文件的变化情况 二、程序里如何import 1. import依赖包 2. 程序编写 本次学习go如果依赖第三方的包&#xff0c;并根据第三方的包提供的接口进行编程&#xff0c;这里需要使用go get命令。下面将go…

线性【SVM】数学原理和算法实现

一. 数学原理 SVM是一类有监督的分类算法&#xff0c;它的大致思想是&#xff1a;假设样本空间上有两类点&#xff0c;如下图所示&#xff0c;我们希望找到一个划分超平面&#xff0c;将这两类样本分开&#xff0c;我们希望这个间隔能够最大化来使得模型泛化能力最强。 如上图所…

open clip论文阅读摘要

看下open clip论文 Learning Transferable Visual Models From Natural Language Supervision These results suggest that the aggregate supervision accessible to modern pre-training methods within web-scale collections of text surpasses that of high-quality crowd…

hadoop配置文件自检查(解决常见报错问题,超级详细!)

本篇文章主要的内容就是检查配置文件&#xff0c;还有一些常见的报错问题解决方法&#xff0c;希望能够帮助到大家。 一、以下是大家可能会遇到的常见问题&#xff1a; 1.是否遗漏了前置准备的相关操作配置&#xff1f; 2.是否遗的将文件夹(Hadoop安装文件夹&#xff0c;/dat…

图及谱聚类商圈聚类中的应用

背景 在O2O业务场景中&#xff0c;有商圈的概念&#xff0c;商圈是业务运营的单元&#xff0c;有对应的商户BD负责人以及配送运力负责任。这些商圈通常是一定地理围栏构成的区域&#xff0c;区域内包括商户和用户&#xff0c;商圈和商圈之间就通常以道路、河流等围栏进行分隔。…

Promise链式调用改写成async/await

首先&#xff0c;Promise链式调用和async/await都是用来解决异步调用层层嵌套的问题。 promise解决了回调地狱的问题&#xff0c;把异步任务完成后的处理函数换个位置放&#xff1a;传给then方法&#xff0c;并支持链式调用&#xff0c;避免层层回调。用catch方法捕获错误。 …

现一个智能的SQL编辑器

补给资料 管注公众号&#xff1a;码农补给站 前言 目前我司的多个产品中都支持在线编辑 SQL 来生成对应的任务。为了优化用户体验&#xff0c;在使用 MonacoEditor 为编辑器的基础上&#xff0c;我们还支持了如下几个重要功能&#xff1a; 多种 SQL 的语法高亮多种 S…

垃圾回收系统小程序定制开发搭建攻略

在这个数字化快速发展的时代&#xff0c;垃圾回收系统的推广对于环境保护和可持续发展具有重要意义。为了更好地服务于垃圾回收行业&#xff0c;本文将分享如何使用第三方制作平台乔拓云网&#xff0c;定制开发搭建垃圾回收系统小程序。 首先&#xff0c;使用乔拓云网账号登录平…

服务器数据恢复—云服务器mysql数据库表被truncate的数据恢复案例

云服务器数据恢复环境&#xff1a; 阿里云ECS网站服务器&#xff0c;linux操作系统mysql数据库。 云服务器故障&#xff1a; 在执行数据库版本更新测试时&#xff0c;在生产库误执行了本来应该在测试库执行的sql脚本&#xff0c;导致生产库部分表被truncate&#xff0c;还有部…

六种最常见的软件供应链攻击

软件供应链攻击已成为当前网络安全领域的热点话题&#xff0c;其攻击方式的多样性和复杂性使得防御变得极为困难。以下我们整理了六种常见软件供应链攻击方法及其典型案例&#xff1a; 软件供应链攻击已成为当前网络安全领域的热点话题&#xff0c;其攻击方式的多样性和复杂性…

pytorch直线拟合

目录 1、数据分析 2、pytorch直线拟合 1、数据分析 直线拟合的前提条件通常包括以下几点&#xff1a; 存在线性关系&#xff1a;这是进行直线拟合的基础&#xff0c;数据点之间应该存在一种线性关系&#xff0c;即数据的分布可以用直线来近似描述。这种线性关系可以是数据点…

Oracle RAC是啥?

Oracle RAC&#xff0c;全称是Oracle Real Application Cluster&#xff0c;翻译过来为Oracle真正的应用集群&#xff0c;它是Oracle提供的一个并行集群系统&#xff0c;由 Oracle Clusterware&#xff08;集群就绪软件&#xff09; 和 Real Application Cluster&#xff08;RA…