1. 程式人生 > >LeetCode-200. Number of Islands

LeetCode-200. Number of Islands

0.原題

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

Input:
11110
11010
11000
00000

Output: 1

Example 2:

Input:
11000
11000
00100
00011

Output: 3

1.程式碼

class Solution:
    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """
        self.row_num = len(grid)
        if self.row_num == 0:
            return 0
        self.column_num = len(grid[0])
        self.visited = [[False for _ in range(self.column_num)] for _ in range(self.row_num)]
        islands = []
        for r in range(self.row_num):
            for c in range(self.column_num):
                if not self.visited[r][c] and grid[r][c] == '1':
                    island = []
                    self.visit(grid,r,c,island)
                    islands.append(island)
        return len(islands)

    def visit(self,grid,row,column,island):
        if not self.visited[row][column] and  grid[row][column] == '1':
            self.visited[row][column] = True
            island.append((row,column))
            if row - 1 >= 0:
                self.visit(grid,row-1,column,island)
            if row + 1 < self.row_num:
                self.visit(grid,row+1,column,island)
            if column - 1 >= 0:
                self.visit(grid,row,column-1,island)
            if column + 1 < self.column_num:
                self.visit(grid,row,column+1,island)

2.思路

首先,我們先解析題意:

給定一個數組,‘1’表示陸地,‘0’表示水域,陸地可以通過水平或者垂直方向連線成一個整體;當一塊陸地被水域所包圍,那麼就形成了一座島嶼;要求根據陣列,推算出島嶼的數量。

比如:

陣列中,所有的“1”連線成了一個島嶼,那麼島嶼數量為:1

接下來,我們思考一下,如何判定“相接區域”:

我們知道,如果兩塊區域數值都為“1”,則這兩塊區域都是“陸地”;

假如選定一個位置(x,y),那麼通過判斷(x,y)的(x-1,y),(x+1,y),(x,y-1),(x,y+1)四個位置的數值是否也為“1”,即可知道(x,y)位置是否與其他“陸地”相接;

如果這兩塊區域相接,那麼就可合併為一塊,在程式的表現即為,判斷值是否相等,相等即將兩塊區域新增到同一個列表中。

之後,通過遞迴的方式,再分別查詢(x-1,y),(x+1,y),(x,y-1),(x,y+1)四個位置的“相接陸地”。

當所有相接的“陸地”都被查詢完成後,遞迴結束。