01矩阵中岛的个数

https://blog.csdn.net/u010150046/article/details/72934668

【题目】

一个矩阵中只有0和1两种值, 每个位置都可以和自己的上、 下、 左、 右
四个位置相连, 如果有一片1连在一起, 这个部分叫做一个岛, 求一个
矩阵中有多少个岛?
举例:
0 0 1 0 1 0
1 1 1 0 1 0
1 0 0 1 0 0
0 0 0 0 0 0
这个矩阵中有三个岛。

【思想】

运用了一些递归的思想,首先是双层for循环逐个遍历矩阵的元素.

找到某个元素为1的时候,利用递归的思想将这个元素的上下左右,和它相邻的为1的上下左右元素,和相邻的相邻的…. 这些元素改为0

最后返回num

【代码】

    //岛的个数
    public static int countIsland(int[][] arr){
        if(arr==null||arr.length==0||arr[0].length==0){
            return 0;
        }
        int res=0;
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr[0].length;j++){
                if(arr[i][j]==1){
                    //coverIsland(arr,i,j);
                    change(arr,i,j);
                    res++;
                }
            }
        }
        return res;
    }

    //报错,数组边界溢出?
    private static void coverIsland(int[][] arr, int i, int j) {
        if(arr[i][j]==0 || i<0 || j<0 || i>=arr.length
                ||j>=arr[0].length) return;
        else{
            arr[i][j]=0;
            coverIsland(arr,i+1,j);
            coverIsland(arr,i,j+1);
            coverIsland(arr,i-1,j);
            coverIsland(arr,i,j-1);
        }

    }

    public static int[][] change(int[][] grid, int i, int j) {  
        // 修改为0 
        grid[i][j] = 0;  

        if (i > 0 && grid[i - 1][j] == 1) {  
            // 修改左边的  
            grid = change(grid, i - 1, j);  
        }  
        if (j < grid[i].length - 1 && grid[i][j + 1] == 1) {  
            // 修改右边的  
            grid = change(grid, i, j + 1);  
        }  
        if (j > 0 && grid[i][j - 1] == 1) {  
            // 修改上边的  
            grid = change(grid, i, j - 1);  
        }  
        if (i < grid.length - 1 && grid[i + 1][j] == 1) {  
            // 修改下边的  
            grid = change(grid, i + 1, j);  
        }  

        return grid;  
    } 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值