1. 程式人生 > >【Leetcode】 200. 島嶼的個數

【Leetcode】 200. 島嶼的個數

給定一個由 '1'(陸地)和 '0'(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。

示例 1:

輸入:
11110
11010
11000
00000

輸出: 1

示例 2:

輸入:
11000
11000
00100
00011

輸出: 3

本題可以使用深度優先搜尋解答。當遇到一塊陸地‘1’時,可以將島嶼計數器ans+1,然後再將這塊陸地以及與之上下左右相連線的陸地一起挖成水‘0’,即將已計算過的‘1’區域全部標記成‘0’,以免妨礙之後的島嶼計數。

程式碼如下:

void landtowater(char** grid, int row, int col, int rowsize, int colsize){
    grid[row][col]='0';//陸地挖成水地 標記已計算的陸地
    if(row>0&&grid[row-1][col]=='1'){//向上搜尋
        landtowater(grid,row-1,col,rowsize,colsize);
    }
    if(row<rowsize-1&&grid[row+1][col]=='1'){//向下搜尋
        landtowater(grid,row+1,col,rowsize,colsize);
    }
    if(col>0&&grid[row][col-1]=='1'){//向左搜尋
        landtowater(grid,row,col-1,rowsize,colsize);
    }
    if(col<colsize-1&&grid[row][col+1]=='1'){//向右搜尋
        landtowater(grid,row,col+1,rowsize,colsize);
    }
}

int numIslands(char** grid, int gridRowSize, int gridColSize) {
    int ans=0;
    for(int i=0;i<gridRowSize;i++)
        for(int j=0;j<gridColSize;j++){
            if(grid[i][j]=='1'){
                ans++;
                landtowater(grid,i,j,gridRowSize,gridColSize);
            }
        }
    return ans;
}