深度优先搜索: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(深度优先搜索)相关推荐

  1. [算法]DFS(深度优先搜索)C++

    1.DFS简介 深度优先搜索(Depth First Search)一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜寻时结点不满 ...

  2. DFS(深度优先搜索)算法实现

    2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...

  3. 【蓝桥杯C/C++】专题五:DFS深度优先搜索

    专题五:DFS深度优先搜索 目录 专题五:DFS深度优先搜索 前言 什么是回溯法 如何理解回溯法 回溯法解决的问题 回溯法模板 1 .回溯函数模板返回值以及参数 2. 回溯函数终止条件 3 .回溯搜索 ...

  4. LeetCode算法总结-回溯法与深度优先搜索

    转载自  LeetCode算法总结-回溯法与深度优先搜索 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退 ...

  5. Nuist集训队作业:深度优先搜索(回溯算法)

    Nuist集训队第一次作业:深度优先搜索(回溯算法) 引例 深搜基本思想及回溯算法模板 P1706 全排列问题 P1219 八皇后 P1605 迷宫 P1101 单词方阵 小结 引例 国际西洋棋棋手马 ...

  6. 【算法】蓝桥杯dfs深度优先搜索之图连通总结

    前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结>      → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,第三次声明下文的 ...

  7. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  8. 【算法】蓝桥杯dfs深度优先搜索之排列组合总结

    [导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...

  9. 【搜索与回溯算法】保卫农场(DFS)

    [搜索与回溯算法]保卫农场 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述: 农夫John的农场里有很多小山丘,他想要在那里布置一些保镖 ...

  10. “暴力美学1”——DFS深度优先搜索

    作为新时代青年,"暴力"二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇 ...

最新文章

  1. 如何查询一个表中除某几个字段外其他所有的字段_一个小故事告诉你:如何写好数据分析报告?...
  2. lede更改软件源_Linux的上传和下载——Ubuntu中软件的安装和ftp服务器的搭建
  3. ABP Framework 研习社经验总结(6.28-7.2)
  4. 密码机项目安装软件时候出现的问题以及对应的解决办法
  5. 『原创』+『参考』亲手实验:使用C#在PPC中播放声音
  6. Reactive(3)5分钟理解 SpringBoot 响应式的核心-Reactor
  7. IT技术人终究要走上管理职位吗?
  8. 一个类中域(field)的首字母不要大写
  9. 使用linux服务器实现路由器的功能(实验)
  10. Windows安装及配置MongoDB
  11. 2012年7月份第1周51Aspx源码发布详情
  12. 八种颠覆未来作战的前沿技术
  13. 基于STM32F030实现RFID射频识别
  14. centOS brctl 创建透明网桥
  15. 这群人,用8年讲述体育能有多迷人
  16. 双路服务器56核系统推荐,双路最高支持56核112线程!华硕妖板羡煞旁人
  17. Adlik发布v0.1.0(Antelope羚羊)版本,赋能深度学习模型产业化
  18. python中用海龟作图画一个八边形
  19. 超级庄家吕梁和中国股市第一案
  20. 源码解析-Volley(转自codeKK)

热门文章

  1. ModelSim free
  2. Mac 软件出现「意外退出」及「崩溃」修复方法
  3. java 子类调用静态方法吗_Java子父类中静态方法
  4. PoE供电的三种标准你知道吗?
  5. Git的下载安装以及基本操作
  6. Springboot注解@Async不生效
  7. DI开关检测计数器WiFi网络模块 开关量NPN PNP输入 频率测量
  8. 【软件定义汽车】【中间件】详述DDS
  9. 银河麒麟v10使用realvnc连接
  10. WireShark实战笔记之DNS协议分析