Java 中怎么在多维数组中进行深度优先搜索(DFS)遍历

胖雪同学_2364

胖雪同学_2364

2026-08-18

200人浏览

原创

java中多维数组dfs本质是将数组视为隐式图,每个位置为节点、相邻位置为邻边;需防越界、防重复访问,并依目标调整逻辑:1.递归模板含边界/状态检查、标记、四向递归;2.迭代法用栈模拟,以dx/dy数组控制方向;3.常见变体包括岛屿计数、最大面积、路径存在性及带状态搜索;4.需注意不规则数组列长、栈溢出风险与visited复用。

java 中怎么在多维数组中进行深度优先搜索(dfs)遍历

Java 中在多维数组中进行深度优先搜索(DFS)遍历,本质是把数组当作隐式图来处理:每个位置(如 grid[i][j])是一个节点,其上下左右(有时含对角线)相邻位置是它的邻接节点。关键在于避免重复访问、防止越界、明确搜索目标(如找连通区域、岛屿数量、路径是否存在等)。

下面分几个实用角度说明:

1. 基础模板:二维数组上的递归 DFS
适用于网格类问题(如岛屿、迷宫、洪水填充等)。核心三步:标记已访问 → 探索四个方向 → 递归深入。

public void dfs(int[][] grid, int i, int j, boolean[][] visited) {
    // 边界检查 + 访问状态检查
    if (i = grid.length || j = grid[0].length 
        || visited[i][j] || grid[i][j] == 0) {  // 假设 0 表示不可通行/非目标
        return;
    }

    visited[i][j] = true;  // 标记为已访问(或直接改 grid[i][j] = 0 实现“原地标记”)

    // 四个方向:上、下、左、右
    dfs(grid, i - 1, j, visited);
    dfs(grid, i + 1, j, visited);
    dfs(grid, i, j - 1, visited);
    dfs(grid, i, j + 1, visited);
}

注意:

  • visited 数组用于防止重复进入同一格子;也可用“染色法”原地修改(如将 1 改为 2),节省空间;
  • 若网格含障碍(如 0 是墙,1 是陆地),条件中需排除障碍;
  • 若需统计连通块大小,可在进入时 count++,作为参数传递或用闭包变量。

2. 非递归实现:用栈模拟 DFS(避免栈溢出)
适合超大网格或深度受限场景。手动维护坐标栈,每次弹出一个点,压入其未访问邻居。

public void dfsIterative(int[][] grid, int startI, int startJ, boolean[][] visited) {
    Stack<int> stack = new Stack();
    stack.push(new int[]{startI, startJ});

    int[] dx = {-1, 1, 0, 0};
    int[] dy = {0, 0, -1, 1};

    while (!stack.isEmpty()) {
        int[] cur = stack.pop();
        int i = cur[0], j = cur[1];

        if (i = grid.length || j = grid[0].length 
            || visited[i][j] || grid[i][j] == 0) {
            continue;
        }

        visited[i][j] = true;

        // 将四个邻居压栈(顺序影响遍历方向,但不影响连通性)
        for (int k = 0; k <p>注意:  </p>
<ul>
<li>
<code>continue</code> 替代 <code>return</code>,因栈中可能存有无效坐标;  </li>
<li>压栈顺序决定“最后访问谁”——比如先压右再压下,实际会先处理下(LIFO);  </li>
<li>不用担心重复压栈,靠 <code>visited</code> 在开头拦截。</li>
</ul>
<p><strong>3. 实际应用中的常见变体</strong>  </p>
<ul>
<li>
<strong>岛屿数量(LeetCode 200)</strong>:外层遍历每个格子,遇到未访问的 <code>1</code> 就启动一次 DFS,计数器加一;  </li>
<li>
<strong>最大岛屿面积</strong>:DFS 返回当前连通块大小,取全局最大值;  </li>
<li>
<strong>判断是否存在路径(起点→终点)</strong>:DFS 中加入 <code>if (i == endI && j == endJ) return true;</code>,提前终止;  </li>
<li>
<strong>带状态的 DFS(如带步数、钥匙、时间)</strong>:此时不能只用二维 <code>visited</code>,需升级为三维甚至四维(如 <code>visited[i][j][mask]</code>),表示在位置 <code>(i,j)</code> 持有钥匙集合 <code>mask</code> 是否来过。</li>
</ul>
<p><strong>4. 安全与效率提醒</strong>  </p>
<ul>
<li>多维数组维度不一致时(如 <code>grid[i]</code> 长度不同),务必用 <code>grid[i].length</code> 而非 <code>grid[0].length</code> 判断列数;  </li>
<li>递归 DFS 深度过大(如 10⁴×10⁴ 网格全连通)可能触发 <code>StackOverflowError</code>,此时必须改用栈迭代;  </li>
<li>若允许多次查询(如动态更新网格后重搜),建议封装成类,复用 <code>visited</code> 数组或重置逻辑。</li>
</ul>
<p>不复杂但容易忽略。</p></int>

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10757

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7882

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6852

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1164

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2829

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20131

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1255

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习