首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何DFS一个二维数组来记录从最左边的列到最右边的列的路径?

DFS(深度优先搜索)是一种用于遍历或搜索图或树的算法。在二维数组中,可以使用DFS来记录从最左边的列到最右边的列的路径。

具体步骤如下:

  1. 创建一个二维数组visited,用于记录每个位置是否已经被访问过。
  2. 从最左边的列的每个位置开始,依次进行DFS搜索。
  3. 对于当前位置(x, y),标记visited[x][y]为已访问。
  4. 判断当前位置是否为最右边的列,如果是,则找到一条从最左边到最右边的路径。
  5. 否则,对当前位置的上、下、右三个方向进行判断:
    • 如果上方位置(x-1, y)未被访问且合法,则进行DFS搜索。
    • 如果下方位置(x+1, y)未被访问且合法,则进行DFS搜索。
    • 如果右方位置(x, y+1)未被访问且合法,则进行DFS搜索。
  • 在DFS搜索完成后,将visited[x][y]标记为未访问,以便其他路径可以经过该位置。

这样,通过DFS搜索,可以找到所有从最左边的列到最右边的列的路径。

以下是一个示例代码(使用Python语言):

代码语言:txt
复制
def dfs(grid, visited, x, y, path):
    visited[x][y] = True
    path.append((x, y))

    if y == len(grid[0]) - 1:
        print("找到一条路径:", path)

    else:
        if x - 1 >= 0 and not visited[x - 1][y]:
            dfs(grid, visited, x - 1, y, path)
        if x + 1 < len(grid) and not visited[x + 1][y]:
            dfs(grid, visited, x + 1, y, path)
        if y + 1 < len(grid[0]) and not visited[x][y + 1]:
            dfs(grid, visited, x, y + 1, path)

    visited[x][y] = False
    path.pop()

def dfs_2d_array(grid):
    m, n = len(grid), len(grid[0])
    visited = [[False] * n for _ in range(m)]

    for i in range(m):
        dfs(grid, visited, i, 0, [])

# 示例调用
grid = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
dfs_2d_array(grid)

在这个示例中,我们使用一个二维数组visited来记录每个位置是否已经被访问过。通过调用dfs_2d_array函数,可以找到从最左边的列到最右边的列的所有路径,并打印出来。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体需求进行适当的修改和优化。

关于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体品牌商,建议您访问腾讯云官方网站或进行相关搜索,以获取最新的产品信息和介绍。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

漫画:如何螺旋遍历二维数组?(修订版)

在周一发布漫画当中,小灰忽略了一个小问题: 当二维数组内层只有一行或一时,螺旋遍历有可能重复访问。因此必须在第3和第4个小循环中加上额外条件限制。 今天出了一个修订版,修正了这个缺陷。...非常感谢大家指正。 ? ? ————— 第二天 ————— ? ? ? 什么意思呢?我们举个例子,给定下面这样一个二维数组: ?...从下到上遍历“左边”: ? 第3层 从左到右遍历“上边”: ? 从上到下遍历“右边”: ? 从右到左遍历“下边”: ? 第三层左边”已无需遍历,二维数组到此遍历完毕。 ? ? ? ? ? ? ?...int m = matrix.length; //n是矩阵数 int n = matrix[0].length; //二维数组层数...当遍历到内层时,4个小循环并不会全都执行,比如测试代码中matrix2内层就只有一,此时只需要遍历“上边”和“右边”。

58720

工程师应该学点算法——图论2

这还是算法说起。前篇 -> 图论1 图遍历 在图遍历中我们一定要掌握两种基础算法:深度优先 和 广度优先。...如上图,任何一个顶点开始,这里 0 ,随机一个方向走下一步,将遍历过点标记,以后不再走,直到走到尽头,再回退(回溯)一个点,这样我们就可以实现深度优先遍历。 ?...如上图有两个数组左边一个数组记录了遍历路径,索引是节点,值是父节点位置,右边数组记录了是否已经标记过,T 代表是,f 代表否。 没看懂?没关系,我一步一步写出来, 举例如下: ?...DFS深度度优先解决: 现在要求你以最快速度去解救小美,你能计算出最快需要几步么?以及求出其最快路径。 ?...1表示地图上障碍物,0表示有路可以走 邻接矩阵(二维数组): 0(你) 0 1 0 0 0 0 0 0 0 1 0 0 1 0(小美) 0 0 0 0 1 答案见文末【阅读全文】 图应用 社交网络:

41520
  • 《剑指 Offer (第 2 版)》数组部分 JavaScript 题解

    二维数组查找 在一个 n * m 二维数组中,每一行都按照从左到右递增顺序排序,每一都按照从上到下递增顺序排序。...请完成一个高效函数,输入这样一个二维数组一个整数,判断数组中是否含有该整数。...旋转数组最小数字 把一个数组开始若干个元素搬到数组末尾,我们称之为数组旋转。 给你一个可能存在 重复 元素值数组 numbers ,它原来是一个升序排列数组,并按上述情形进行了一次旋转。...搜索下一单元格:朝当前元素 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 res 。...,继续递归上下右左看是否有满足等于单词路径,只要有一个路径满足就行,所以 || 连接 const res = dfs(i + 1, j, k + 1) || dfs(i, j + 1,

    68430

    Leetcode【120、611、813、915】

    Triangle 解题思路: 这道题是给一个三角形,顶到下计算最小路径和。 容易想到用动态规划求解,dp[i][j] 存储累加到位置 (i, j) 最小路径和。...Partition Array into Disjoint Intervals 解题思路: 这道题是给一个数组,将其划分成两部分,使得左边所有数小于等于右边所有数,返回划分位置。...根据题意,我们知道左右两边数组满足左边最大值<=右边最小值,因此,我们只需要找到第一处满足上述条件位置,就是最终答案。...做法:可以使用左右遍历法,记录左边最大值和右边最小值,分别保存在数组中。然后,再对原来数组从左到右遍历每一个划分位置,去查左最大和右最小数组,发现第一个满足上述条件位置就是答案。...,因此没必要计算左边最大值数组,用一个变量即可。

    45220

    每日一题(2022-04-27)—— 太平洋大西洋水流问题

    太平洋大西洋水流问题 问题描述 有一个 m × n 矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆左边界和上边界,而 “大西洋” 处于大陆右边界和下边界。...visited1[i] = make([]bool, n) visited2[i] = make([]bool, n) for j := 0; j < n; j++ { // 顶部一行或者左边...: 道理同BFS 代码: // 该题是一个二维平面回溯算法题目 // 边界长度,m var m, n = 0, 0 var g [][]int func pacificAtlantic(heights...(0,0)开始 进行深度优先搜索 for i := 0; i < m; i++ { for j := 0; j < n; j++ { // 顶部一行或者左边,可以流入海洋1 if...visited1[i][j] { dfs(i, j, visited1) } } // 底部那一行和右边那一,可以流入海洋2 if i == m-1 || j

    20510

    漫画:如何螺旋遍历二维数组

    我们举个例子,给定下面这样一个二维数组: ? 我们需要从左上角元素1开始,按照顺时针进行螺旋遍历,一直遍历完所有的元素,遍历路径就像下图一样: ?...从下到上遍历“左边”: ? 第3层 从左到右遍历“上边”: ? 从上到下遍历“右边”: ? 从右到左遍历“下边”: ? 第三层左边”已无需遍历,二维数组到此遍历完毕。 ? ? ? ? ? ? ?...Integer> spiralOrder(int[][] matrix) { List list = new ArrayList(); //当二维数组是空或任何一个维度是...大循环控制了每一层遍历,4个小循环分别实现了同一层上边、右边、下边,左边遍历。...当遍历到内层时,4个小循环并不会全都执行,比如测试代码中matrix2内层只有一个元素13,那么执行完第1个小循环,就不会再进入后面3个小循环: ? ? ? ?

    71810

    漫画:如何螺旋遍历二维数组

    我们举个例子,给定下面这样一个二维数组: 我们需要从左上角元素1开始,按照顺时针进行螺旋遍历,一直遍历完所有的元素,遍历路径就像下图一样: 经过这样遍历,返回元素结果如下: 1,2,3,4...“左边”: 第2层 从左到右遍历“上边”: 从上到下遍历“右边”: 从右到左遍历“下边”: 从下到上遍历“左边”: 第3层 从左到右遍历“上边”: 从上到下遍历“右边”: 从右到左遍历“下边”: 第三层...“左边”已无需遍历,二维数组到此遍历完毕。...大循环控制了每一层遍历,4个小循环分别实现了同一层上边、右边、下边,左边遍历。...当遍历到内层时,4个小循环并不会全都执行,比如测试代码中matrix2内层只有一个元素13,那么执行完第1个小循环,就不会再进入后面3个小循环: —————END—————

    1.4K31

    DFS 算法秒杀五道岛屿问题

    本文主要来讲解如何DFS 算法秒杀岛屿系列问题,不过用 BFS 算法核心思路是完全一样,无非就是把 DFS 改写成 BFS 而已。 那么如何二维矩阵中使用 DFS 搜索呢?...这里额外说一个处理二维数组常用小技巧,你有时会看到使用「方向数组」来处理上下左右遍历,和前文 图遍历框架 代码很类似: // 方向数组,分别代表上、下、左、右 int[][] dirs = new...岛屿数量 这是力扣第 200 题「岛屿数量」,简单也是经典一道岛屿问题,题目会输入一个二维数组grid,其中只包含0或者1,0代表海水,1代表陆地,且假设该矩阵四周都是被海水包围着。...把靠左边岛屿淹掉 dfs(grid, i, 0); // 把靠右边岛屿淹掉 dfs(grid, i, n - 1); } // 遍历...dir记录方向,dfs函数递归结束后,sb记录着整个遍历顺序,其实这就是前文 回溯算法核心套路 说到回溯算法框架,你看到头这些算法都是相通

    86310

    【C++笔试强训】如何成为算法糕手Day7

    dfs方法: 设目前指针指向一个岛屿中某一点 (i, j),寻找包括此点岛屿边界。... (i, j) 向此点上下左右 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 做深度搜索。...// 第一行第一开始,寻找有没有是'1'位置,若有,则登岛遍历,岛屿数加1 for (int i = 0; i < row; ++i) {...步骤: 遍历这个二维数组,将所有的1都认为是一个单独集合 遍历这个二维数组,对于每一个1,只看它左边和上边,如果发现有1,就做union操作(为甚只看左边和上边,因为右边和下边是对称,而我们从左到右...if (parent[idx] == idx) return idx; // 路径压缩,只要idx节点父节点不是整个集合头节点,那么就把路径上每个节点都向集合头结点

    9510

    SDUT 2019 级程序设计基础(B)II 实验6–动态规划

    下面以POJ1163题为例:原题直通车 在下面的数字三角形中寻找一条顶部到底边路径,使得路径上所经过数字之和最大。路径每一步都只能往左下或 右下走。...a[x][y]存数字三角形,x表示行,y表示(xy1开始算起),然后我们用ans[x][y]表示点(x,y)到底部最佳路径,问题就变成求ans[1][1]了,那么首先我们可以想到递归做法——...,比6-4难很多,用到了变维dp思想,我们知道两个字符串求最长公共子序列问题时使用了一个二维dp保存所有的状态,但这里是多个字符串,三位数组不太现实,我们可以利用哈希,把多维状态储存到一维,然后再利用类似于求两个字符串思想来求...)和动态规划知识 这道题要求是得到正数最小路径,那么单单一个dp记录一条路是不行,你需要遍历所有情况,走过所有路才能得到最优情况,dfs就可以满足要求,具体看呆码 #include <stdio.h...0; } 6-9免费馅饼 当前状态可以由上一秒左边位置、右边位置或者原位置变来,所以我们用一个二维坐标dp[t][x]表示t秒x位置最多馅饼数,这里我们得结束时间往前遍历。

    32031

    leetcode436. Find Right Interval

    假设一个二维整数数组中每一行表示一个区间,每一行一个值表示区间左边界,第二个值表示区间右边界。现在要求返回一个整数数组,用来记录一个边界右侧邻近区间。...思路1:二分法 如果我们将区间按照左边界进行排序,则针对每一个区间右边界,只要找到左边界比这个值大最小左边界所在区间即可。...这里不能够直接对原来二维数组进行排序,因为会丢失每一个区间原始下标位置。代码中采用了内部类Node记录一个区间左边界以及每一个区间原始下标,并对Node进行排序和二分法查找。...反过来,也可以右往左遍历bucket数组,每遇到一个没有填充位置,就将右侧值赋予当前位置。...,如何理解bucket数组,这个bucket数组本质上是将所有的区间以最左边界和最右边界展开,数组一个下标对应着区间中相对位置,并记录了这个下标右侧一个区间位置。

    51020

    【综合笔试题】难度 3.55,多解法热门二叉树笔试题

    二叉树 垂序遍历 左边开始直到最右边结束,按索引每一所有结点,形成一个按出现位置从上到下排序有序列表。如果同行同列上有多个结点,则按结点值从小到大进行排序。...用三个「哈希表」记录相关信息: 使用 node2row 和 node2col 分别用来记录「节点到行」&「节点到映射关系,并实现 dfs1 对树进行遍历,目的是为了记录下相关映射关系; 使用...col2row2nodes 记录列到行,行到节点集」映射关系,具体存储格式为 {col : {row : [node1, node2, ... ]}},实现 dfs2 再次进行树遍历,配合之前...,根据「节点到」&「节点到行」映射关系,构造出「列到行,行到节点集」映射关系 void dfs2(TreeNode root) { if (root == null)...(root.left); dfs2(root.right); } // 树遍历,记录下「节点到」&「节点到行」映射关系 void dfs1(TreeNode

    46030

    DFS深度优先搜索解决迷宫问题

    ,我们试探到一个符合条件节点,就继续按照顺时针方向接着进行试探,每经过一个节点,都要使用visited[x][y]=true数组标记该节点已经被访问过。   ...visited[x][y + 1]){ //是道路且没有被访问过 visited[x][y+1]=true; //将右边点设置为已访问 dfs(x...,y+1,step+1);//继续右边这个点进行深度优先搜索 //当上一步dfs执行完,回退时候需要将这个点设置为未访问 visited[x][y+1.../继续左边这个点进行深度优先搜索 //当上一步dfs执行完,回退时候需要将这个点设置为未访问 visited[x][y-1]=false;...而我们二维数组a[100][100]默认初始化是全为0,所以边界外a[i][j]全为0,不符合条件。我们是a[1][1]走,a[0][0]并没有使用,所以即使从起点向左向上也不会越界。

    85340

    解救小哈——DFS算法举例

    二、问题分析 首先我们用一个二维数组存储这个迷宫,刚开始时候,小哼处于迷宫入口处(1,1),小哈在(p,q)。其实这道题本质就在于找(1,1)到(p,q)最短路径。...此时摆在小哼面前路有两条,我们可以先让小哼往右边走,直到走不通时候再回到这里,再去尝试另外一个方向。 在这里我们规定一个顺序,按照顺时针方向来尝试(即右→下→左→上)。...例如下图就是一条可行搜索路径: 三、解决问题——深度优先搜索 (1)如何dfs函数。 dfs函数功能是解决当前应该怎么办。...} return 0; } (3)如何获得下一个方向坐标(此处定义一个方向数组)。...在这里我们用book[tx][ty]记录格子[tx][ty]是否已经在路径中。 如果这个点符合所有的要求,就对这个点进行下一步扩展,即dfs(tx,ty,step+1)。

    1K80

    DFS(深度优先遍历)

    DFS根(或在图中某个任意节点)开始,探索尽可能深分支,直到达到目标节点,或者当前分支没有更多节点可以访问。然后,搜索回溯到开始探索路径一个节点。...在树中,这意味着沿着树最深路径进行搜索,直到到达叶节点或无法再深入,然后回溯到开始搜索路径一个节点。 在二叉树前序遍历中,每个节点被访问顺序实际上反映了DFS搜索树方式。...先访问当前节点对应于DFS“探索当前节点”,然后深入左子树对应于“先探索最左边分支”,最后访问右子树则是“在左侧无更多可探索路径时,回溯并探索右侧分支”。...输入:5 输出:10 思路:对于这种题,首先,我们想到是使用二维数组存,然后暴力枚举,判断函数来一个一个判断。...那么,就得到了一个大概思路:对二维数组所有情况进行枚举,然后对每种情况进行判断,这是这种题目的普遍思想,接下来是对题目进行细致分析。 这种题主要难点是判断、遍历如何实现。

    61410

    ​C++ 八数码问题理解 IDA* 算法原则:及时止损,缘尽即散

    注意,不需要计算0滑块之间距离。0所在位置可以认为是一个位置,空位置不存在距离。 平面坐标与线性坐标的转换 拼图可以使用二维数组也可以使用一维数组存储。...本文使用一维数组存储,拼图逻辑结构上是二维数组。所以,就需要把物理上一维数组坐标转换为逻辑上二维坐标。 如下图,一维数组中数字4线性坐标为4。 与一维数组相对应二维数组如下图所示。...数字4在二维数组坐标为(1,1)。 其转换公式如下: 4(一维数中坐标) / 3=1(二维数组行坐标)。 4(一维数中坐标) % 3=1(二维数组坐标)。...一维数组中4位置转换后在二维数组位置为(1,1)。 二维数组坐标转换为一维数组坐标为上面表达式逆运算。...3*1(二维数组标)+1(二维数组坐标)=4(一维数组坐标) 编码实现 前期准备: #include #include using namespace

    22210

    不同路径

    示例 1: 输入:m = 3, n = 7 输出:28 示例 2: 输入:m = 3, n = 2 输出:3 解释: 左上角开始,总共有 3 条路径可以到达右下角。 1....递归边界条件是走到了最右边、或者是走到了最下面一行。 动态规划正好是反过来,因为我们是从上到下一行一行推导。 所以我们要处理下第一行和第一,将它们都赋予1即可。...而经过上一次计算之后,第四值是4。 此时我们并不需要再跟上一行做累加,只需要用4加上左边6就可以了。 所以我们可以申请一维数组数组长度就是n。...i 行时,只需要 i - 1 行内容就可以了 所以用一维数组代替 那么这句就很关键: dp[j] = dp[j] + dp[j - 1] 对比下 一维和二维这两个公式,其实有相似的地方 拿等号右边对比说...,相当于二维数组“上方” # dp[j - 1] 是刚刚计算后左边,相当于二维数组左边” dp[j] = dp[j] + dp[j - 1]; 二维和一维都是从左往右更新,所以计算dp[j

    26520
    领券