搜索与回溯算法:DFS(深度优先搜索)
深度优先搜索:1.确定回溯终止条件2.重复生成其他可能
今天开始改用JavaScript
我的LeetCode题解:
力扣,剑指 Offer 12. 矩阵中的路径
力扣,剑指 Offer 13. 机器人的运动范围
------------------------------------
剑指 Offer 12. 矩阵中的路径
根据题目分析要找到矩阵中与word字符串第一个值相同的下标,并利用下标进行dfs匹配word字符串后面的单词是否一致。
首先有两层循环来寻找与word第一个值相等,并将i,j,k传递给dfs(k为字符串下标的当前值,默认0)
dfs函数的定义:1,先写终止条件,①i,j越界②值与word中的值不等,return false
在dfs中每获得一个下标,在对比过word后将其改为0,并用temp记录原值
如果均满足,则再次进行其他四个方向的dfs递归,将结果保存在res中,后需要对原矩阵中的字符还原值,以便如果当前符合字符串首个字母相等的情况不为最终结果,其他与首字母相等情况的递归。
code:
/*** @param {character[][]} board* @param {string} word* @return {boolean}*/
var exist = function(board, word) {var row = board.length;//row为二维数组的行数var col = board[0].length;//col为二维数组的列数if (row*col<word.length)return false;//如果二维数组的长度没有字符长度长则直接返回falsevar dfs = function(i,j,k){//定义深度函数if(i<0||i>=row||j<0||j>=col||board[i][j] != word[k])return false;//递归调用的情况永远先写回溯条件if(k == word.length - 1)return true;//当字符为最后一个的时候并且经过上一行的判断,word已经匹配完毕,返回truevar temp = board[i][j];//先存储一下当前的字母board[i][j] = '0';//定义为零是为了在上面的回溯条件使其不会走“回头路”var res = dfs(i+1,j,k+1)||dfs(i-1,j,k+1)||dfs(i,j+1,k+1)||dfs(i,j-1,k+1);//进行四个方向的搜索board[i][j] = temp;//在回溯的时候还原字母,再次寻找与word首字母相等的其他情况return res;}for(var i=0 ; i<row;i++){//循环获取二维数组与word第一个字符相等的i和j,for(var j=0;j<col;j++){if(board[i][j] == word[0]){if (dfs(i,j,0)) return true;//传递给dfs函数做回溯}}}return false;
};
剑指 Offer 13. 机器人的运动范围
最开始时如果k == 0则机器人除了本格无法去其他各自,直接返回1。
该题机器人在行走时是根据当前格子的各个位相加是否大于k来进行判断的,则需要定义一个num函数,用于计算一个数各个位相加的结果。
dfs的写法:首先所有递归的回溯都必须是先写回溯条件,本题的条件有两个:
1>:i,j不能越界(不能大于等于m,n,不能小于0)。
2>:不走之前已经走过的路,每个格子只访问一次(开始时定义一个二维数组来记录是否访问过,初始值为false,访问过后修改为true)
不满足上述条件之后,先将i,j的二维数组修改为true,代表已经走过这个位置
之后来判断机器人是否能走到这个格子,即为num(i)+num(j)<=k,如果满足则res加一,分别进行递归其他四个方向。
调用函数并且return res
根据注释简单明了
/*** @param {number} m* @param {number} n* @param {number} k* @return {number}*/
var movingCount = function(m, n, k) {if(k == 0)return 1;//如果k等于0则只有第一格一个结果const visited = new Array(m).fill(0).map(() => new Array(n).fill(false));//新建一个二维数组并且全部为false,用于记录走过的值。var res = 0;//定义结果初始值为0var num = function(nums){//定义一个让数字各个位相加的函数var n = 0;while (nums){n += nums%10;nums = Math.floor(nums/10);//地板除法,取小}return n;}var dfs = function(i,j){//定义深度搜索函数if (i>=m||j>=n||i<0||j<0||visited[i][j])return;//先写回溯条件,visited数组初始值均为falsevisited[i][j] = true;//赋值为真,防止对其重复访问n1 = num(i);n2 = num(j);if (n1+n2<=k){//应题目要求,如果各个位相加小于k则答案加一res ++;dfs(i+1,j);//对其他四个方向进行访问dfs(i-1,j);dfs(i,j+1);dfs(i,j-1);}}dfs(0,0);//调用从0,0进行深度优先搜索return res;
};
搜索与回溯算法:DFS(深度优先搜索)相关推荐
- [算法]DFS(深度优先搜索)C++
1.DFS简介 深度优先搜索(Depth First Search)一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜寻时结点不满 ...
- DFS(深度优先搜索)算法实现
2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...
- 【蓝桥杯C/C++】专题五:DFS深度优先搜索
专题五:DFS深度优先搜索 目录 专题五:DFS深度优先搜索 前言 什么是回溯法 如何理解回溯法 回溯法解决的问题 回溯法模板 1 .回溯函数模板返回值以及参数 2. 回溯函数终止条件 3 .回溯搜索 ...
- LeetCode算法总结-回溯法与深度优先搜索
转载自 LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...
- Nuist集训队作业:深度优先搜索(回溯算法)
Nuist集训队第一次作业:深度优先搜索(回溯算法) 引例 深搜基本思想及回溯算法模板 P1706 全排列问题 P1219 八皇后 P1605 迷宫 P1101 单词方阵 小结 引例 国际西洋棋棋手马 ...
- 【算法】蓝桥杯dfs深度优先搜索之图连通总结
前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结> → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结> 为了重申感谢之意,第三次声明下文的 ...
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...
- 【算法】蓝桥杯dfs深度优先搜索之排列组合总结
[导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结> 为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...
- 【搜索与回溯算法】保卫农场(DFS)
[搜索与回溯算法]保卫农场 (Standard IO) 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 题目描述: 农夫John的农场里有很多小山丘,他想要在那里布置一些保镖 ...
- “暴力美学1”——DFS深度优先搜索
作为新时代青年,"暴力"二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇 ...
最新文章
- 如何查询一个表中除某几个字段外其他所有的字段_一个小故事告诉你:如何写好数据分析报告?...
- lede更改软件源_Linux的上传和下载——Ubuntu中软件的安装和ftp服务器的搭建
- ABP Framework 研习社经验总结(6.28-7.2)
- 密码机项目安装软件时候出现的问题以及对应的解决办法
- 『原创』+『参考』亲手实验:使用C#在PPC中播放声音
- Reactive(3)5分钟理解 SpringBoot 响应式的核心-Reactor
- IT技术人终究要走上管理职位吗?
- 一个类中域(field)的首字母不要大写
- 使用linux服务器实现路由器的功能(实验)
- Windows安装及配置MongoDB
- 2012年7月份第1周51Aspx源码发布详情
- 八种颠覆未来作战的前沿技术
- 基于STM32F030实现RFID射频识别
- centOS brctl 创建透明网桥
- 这群人,用8年讲述体育能有多迷人
- 双路服务器56核系统推荐,双路最高支持56核112线程!华硕妖板羡煞旁人
- Adlik发布v0.1.0(Antelope羚羊)版本,赋能深度学习模型产业化
- python中用海龟作图画一个八边形
- 超级庄家吕梁和中国股市第一案
- 源码解析-Volley(转自codeKK)