LeetCode 463. 島嶼的周長 JAVA

Sinb妃發表於2020-10-30

給定一個包含 0 和 1 的二維網格地圖,其中 1 表示陸地 0 表示水域。

網格中的格子水平和垂直方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。

島嶼中沒有“湖”(“湖” 指水域在島嶼內部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形。網格為長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。

示例 :

輸入:
[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]

輸出: 16

解釋: 它的周長是下面圖片中的 16 個黃色的邊:



來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/island-perimeter
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題解:從題目我們可以知道,一個陸地,如果某一個方向也是陸地,則會使得這片陸地的周長減一,以此為基礎點,我們可以利用深度搜尋找出島嶼的周長。
1、找到網格地圖中第一個陸地,進入深度搜尋;
2、一個陸地如果周圍都是水域的話,周長則為4,所以深度搜尋的話,我們需要找尋以這個陸地為中心的周圍陸地,如果找到一個陸地,周長則減1,如果這個陸地四周都被陸地包圍,則其周長為0;
3、如果一個陸地某個方向為陸地,且未曾深度搜尋過,則此方向的陸地進入深度搜尋;
4、最後將每一個陸地的周長相加,得到島嶼的周長返回即可。

class Solution {
    int res;
    public int islandPerimeter(int[][] grid) {
        res=0;
        boolean visit[][]=new boolean[grid.length][grid[0].length];
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[i].length;j++){
                if(grid[i][j]==1){
                    visit[i][j]=true;
                    dfs(grid,visit,i,j);
                    return res;
                }
            }
        }
        return res;
    }
    public void dfs(int grid[][],boolean visit[][],int row,int col){
        int sum=4;
        if(row-1>=0&&grid[row-1][col]==1){
            sum--;
            if(visit[row-1][col]==false){
                visit[row-1][col]=true;
                dfs(grid,visit,row-1,col);
            }
        }
        if(row+1<grid.length&&grid[row+1][col]==1){
            sum--;
            if(visit[row+1][col]==false){
                visit[row+1][col]=true;
                dfs(grid,visit,row+1,col);
            }
        }
        if(col-1>=0&&grid[row][col-1]==1){
            sum--;
            if(visit[row][col-1]==false){
                visit[row][col-1]=true;
                dfs(grid,visit,row,col-1);
            }
        }
        if(col+1<grid[0].length&&grid[row][col+1]==1){
            sum--;
            if(visit[row][col+1]==false){
                visit[row][col+1]=true;
                dfs(grid,visit,row,col+1);
            }
        }
        res+=sum;
    }
}

相關文章