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;  
    } 

猜你喜欢

转载自blog.csdn.net/junjunba2689/article/details/80591287