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

递归实现洪水填充(FloodFill)功能的代码问题排查求助

递归实现洪水填充(FloodFill)功能的代码问题排查求助

嘿,我看了你这段递归实现FloodFill的代码,发现几个关键问题,这应该就是导致功能异常甚至运行报错的原因:

1. 严重的数组索引越界问题

在floodStep方法里,你直接对当前WATER单元格的上下左右邻居赋值为WATER,但完全没判断这些邻居是否在网格的合法范围内。比如当处理第一行(row=0)的WATER单元格时,row-1就变成了-1,直接访问newArea[row-1][col]会立刻抛出ArrayIndexOutOfBoundsException;同理处理最后一行、最左/最右列的单元格时都会出现这个问题。

2. 没有判断邻居是否为LAND就直接覆盖

洪水填充的逻辑是只有邻居是LAND的时候才会被转换成WATER,但你现在不管邻居原来是什么,直接强制设为WATER,这会破坏原本的网格状态,也不符合FloodFill的规则。

3. 代码语法错误

你的return areaToString(newArea);语句写在了floodStep方法的闭合大括号外面,这会导致编译失败,方法根本无法正常编译运行。

4. (潜在问题)常量未显式定义

代码里使用了WATER常量,但没看到你在类里或者接口里定义它,如果FloodFill接口里也没定义的话,会出现编译错误。


修复后的floodStep方法示例

我把这些问题都修复了,你可以参考:

private String floodStep(final String map) {
    char[][] area = stringToArea(map);
    char[][] newArea = new char[area.length][area[0].length];
    // 先复制原网格到新网格
    for (int row = 0; row < area.length; row++) {
        System.arraycopy(area[row], 0, newArea[row], 0, area[row].length);
    }

    for (int row = 0; row < area.length; row++) {
        for (int col = 0; col < area[row].length; col++) {
            if (area[row][col] == WATER) {
                // 检查上方邻居:row-1 >=0 且原单元格是LAND
                if (row - 1 >= 0 && area[row-1][col] == LAND) {
                    newArea[row-1][col] = WATER;
                }
                // 检查下方邻居:row+1 < 网格行数
                if (row + 1 < area.length && area[row+1][col] == LAND) {
                    newArea[row+1][col] = WATER;
                }
                // 检查左方邻居:col-1 >=0
                if (col - 1 >= 0 && area[row][col-1] == LAND) {
                    newArea[row][col-1] = WATER;
                }
                // 检查右方邻居:col+1 < 当前行的列数
                if (col + 1 < area[row].length && area[row][col+1] == LAND) {
                    newArea[row][col+1] = WATER;
                }
            }
        }
    }
    // 把return放回方法体内部
    return areaToString(newArea);
}

另外记得确保LAND和WATER常量是正确定义的,比如在类里添加:

// 在RecursiveFloodFill类里声明常量
private static final char WATER = 'W';
private static final char LAND = 'L';

这样修改后,你的递归FloodFill应该就能按照预期工作了:每一步只会把WATER相邻的LAND转换成WATER,直到整个网格没有可转换的LAND为止,递归也会正常终止。

备注:内容来源于stack exchange,提问作者Spiritus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:07:57