递归实现洪水填充(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
相关产品推荐
相关产品推荐

