Java二维数组可通行区域遍历及行走方向输出问题求助
问题解答
1. Flood Fill算法的方向选择是否正确?
你定义的方向数组delRow和delCol对应上、右、下、左四邻域,这个选择完全正确。Flood Fill核心就是遍历相邻可通行区域,四邻域是这类网格遍历场景的标准选择,完全适配你的0(墙体)、1(可通行)地图规则。
2. 能否用Flood Fill输出遍历的行走方向?
可以实现,但你当前代码的方向判断逻辑完全错误(比如用nrow == 1判断Right,这和方向没有关联)。核心思路是:根据当前节点与下一个节点的坐标偏移量,直接映射对应方向,同时在DFS遍历的过程中记录方向。
修正后的完整代码
import java.util.ArrayList; import java.util.List; class Solution { // 存储遍历的行走方向 private List<String> pathDirections = new ArrayList<>(); // 方向映射:与delRow/delCol的索引一一对应(上、右、下、左) private String[] directionNames = {"Up", "Right", "Down", "Left"}; private void dfs(int row, int col, int[][] ans, int[][] image, int newColor, int[] delRow, int[] delCol, int iniColor) { ans[row][col] = newColor; int n = image.length; int m = image[0].length; for(int i = 0; i < 4; i++) { int nrow = row + delRow[i]; int ncol = col + delCol[i]; if(nrow >= 0 && nrow < n && ncol >= 0 && ncol < m && image[nrow][ncol] == iniColor && ans[nrow][ncol] != newColor) { // 记录从当前节点到下一个节点的方向 pathDirections.add(directionNames[i]); dfs(nrow, ncol, ans, image, newColor, delRow, delCol, iniColor); // 若需要记录回溯路径(返回起点的方向),可取消下面注释 // pathDirections.add(getReverseDirection(directionNames[i])); } } } // 可选:获取反向方向,用于记录回溯路径 private String getReverseDirection(String dir) { switch(dir) { case "Up": return "Down"; case "Right": return "Left"; case "Down": return "Up"; case "Left": return "Right"; default: return ""; } } public int[][] floodFill(int[][] image, int sr, int sc, int newColor) { int iniColor = image[sr][sc]; // 创建新数组存储结果,避免修改原输入数组 int[][] ans = new int[image.length][image[0].length]; for(int i = 0; i < image.length; i++) { System.arraycopy(image[i], 0, ans[i], 0, image[i].length); } int[] delRow = {-1, 0, +1, 0}; int[] delCol = {0, +1, 0, -1}; dfs(sr, sc, ans, image, newColor, delRow, delCol, iniColor); // 打印行走方向 System.out.println("遍历行走方向顺序:"); pathDirections.forEach(System.out::println); return ans; } public static void main(String[] args) { int[][] image = { {1,1,1,0,1,1}, {0,0,1,0,1,1}, {1,1,1,1,1,0}, {0,0,0,0,0,0}, {1,1,1,0,1,1} }; Solution obj = new Solution(); int[][] ans = obj.floodFill(image, 0, 0, 2); // 打印标记后的可通行区域 System.out.println("\n标记后的可通行区域:"); for(int i = 0; i < ans.length; i++){ for(int j = 0; j < ans[i].length; j++) System.out.print(ans[i][j] + " "); System.out.println(); } } }
关键修改说明
- 新增
directionNames数组,直接通过方向偏移的索引映射方向名称,逻辑准确清晰。 - 创建独立的
ans数组,避免修改原输入数组(原代码直接赋值ans = image会破坏原始数据,属于不规范写法)。 - 用
List<String>统一存储所有行走方向,遍历完成后批量输出,避免零散打印。 - 可选实现了反向方向记录逻辑,用于需要回溯路径的场景。
输出说明
运行代码后会先打印遍历的行走方向顺序,随后输出标记为2的可通行区域地图,完全满足需求。
内容的提问来源于stack exchange,提问作者David T Laszlo
相关产品推荐
相关产品推荐

