【Java深度优先搜索】力扣题目-水域大小

 难度不高,深度优先,广度优先都可以做这道题

这道题我采用深度优先遍历进行处理

具体题解都写在注释里了

class Solution {
    // 定义一个方向数组,用于表示一个单元格周围8个方向与当前位置的坐标差
    static int[][] dir={{1,1},{1,-1},{-1,-1},{-1,1},{1,0},{-1,0},{0,1},{0,-1}};

    public int[] pondSizes(int[][] land) {
        // 创建一个ArrayList,用于存储所有湖泊的大小
        ArrayList<Integer> ar=new ArrayList<>();
        for(int i=0;i<land.length;i++){ 
            for(int j=0;j<land[0].length;j++){
                // 如果当前单元格未被访问,并且是湖泊
                if(land[i][j]==0){
                    int space=1; // 初始化当前湖泊的面积为1
                    ar.add(dfs(land,i,j,space)); // 对当前湖泊进行DFS,并将其面积添加到ArrayList中
                }
            }
        }

        // 将ArrayList转换为int数组,然后对所有湖泊的大小进行排序
        int[] pool=new int[ar.size()];
        for(int k=0;k<pool.length;k++){
            pool[k]=ar.get(k);
        }
        Arrays.sort(pool);
        return pool;
    }

    // 定义DFS函数, 用于搜索与当前单元格相邻的所有湖泊单元格的面积
    public int dfs(int[][] land,int dx,int dy,int space){
        // 根据边界条件和未访问的单元格判断是否遍历完成当前湖泊
        if(dx<0||dy<0||dx>=land.length||dy>=land[0].length||land[dx][dy]!=0){
             return space; // 当前湖泊已遍历完成,返回湖泊的面积
        }

        land[dx][dy]=-1; // 标记当前单元格已被访问
        for(int i=0;i<8;i++){
            int x=dx+dir[i][0],y=dy+dir[i][1];
            while(x>=0&&x<land.length&&y>=0&&y<land[0].length&&land[x][y]==0){                          
                space++; // 如果当前单元格是湖泊的一部分,则增加当前湖泊的面积
                space=dfs(land,x,y,space); // 继续向湖泊周围的单元格搜索
                land[x][y]=-1; // 标记当前湖泊中的单元格已被访问
                x+=dir[i][0]; // 在当前方向上继续向前移动一格
                y+=dir[i][1];
            }
        }
        return space;
    }
}

当然,我们可以不使用static dir方向数组,直接使用for循环替换,进行深度优先搜索

for (int dx = -1; dx <= 1; dx++) {
            for (int dy = -1; dy <= 1; dy++) {
                if (dx == 0 && dy == 0) {
                    continue;
                }
                res += dfs(land, x + dx, y + dy);
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值