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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:45:43