You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin版岛屿数量问题中DFS递归部分的原理解析

题目描述

给定一个m×n的二维二进制网格grid,其中'1'代表陆地,'0'代表水域,返回岛屿的数量。岛屿由水平或垂直相邻的陆地连接而成,且网格四周均被水域环绕。

示例1

Input: grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]

Output: 1

示例2

Input: grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]

Output: 3

代码与疑问

以下是该问题的一份Kotlin实现代码,我理解大部分逻辑,但对其中DFS函数的方向递归部分存在疑问:

fun numIslands(grid: Array<CharArray>): Int {
        var count = 0
        
        for (i in grid.indices){
            for (j in grid[0].indices){
                if(grid[i][j] == '1'){
                    dfs(grid, i, j)
                    count++
                }
            }
        }
        return count
        
    }
    
    private fun dfs(grid: Array<CharArray>, i: Int, j: Int){
        if(i < 0 || j < 0 || i >= grid.size|| j >= grid[0].size || grid[i][j] == '0'){
            return
        }
        
        //directional recursion
        grid[i][j] = '0'
        dfs(grid, i + 1, j)
        dfs(grid, i, j + 1)
        dfs(grid, i - 1, j)
        dfs(grid, i, j - 1)
    }

我的问题是:这部分递归调用的作用是什么?是否是遍历当前字符在二维网格中的上下左右所有相邻区域?还是存在其他逻辑?希望得到解答,谢谢。

解答

这四个递归调用就是遍历当前位置的上下左右四个相邻区域,核心目的是把当前所在的整个岛屿全部"标记为水域",避免后续重复计数。

具体逻辑拆解:

  • 当找到一块陆地('1')时,先把当前位置改成'0'(相当于标记已访问,防止重复处理)
  • 接着递归检查上下左右四个方向:如果相邻位置是陆地,就继续执行"标记为水域+递归检查相邻"的操作
  • 这样整个连通的陆地都会被改成'0',后续外层循环遍历到这些位置时,只会看到'0',不会再触发计数,保证每个岛屿只被统计一次

比如示例1中左上角的'1',调用DFS后,所有连通的'1'都会被置为'0',外层循环后续遍历这些位置时不会再计数,所以最终只统计1个岛屿。

内容的提问来源于stack exchange,提问作者OEThe11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:03:19