# 200 Number of Islands

Input是一個2d的matrix,由0和1組成,1如果彼此相連(上下左右)代表是同一個島嶼,若不相連則為不同的島嶼。回傳整個grid裡共有幾個島嶼。

本來想說這個跟battleship on the board好像差不多,仔細一看其實不一樣,

Battleships can only be placed horizontally or vertically.

Battleships只會是長條形,但Islands可以是各種形狀。

所以就不能單純只看左邊或上面有沒有1來判斷是不是同個島嶼,四個neighbor都要check。

Concept:

掃過grid上的每個element,當讀到1時,找出這個island的所有grid,並設為x表示已經找過,當把整個island都設為x了,counter++

用function exlore()找出island的所有grid,explore會收到整個grid和當下的位置,檢查當下位置上下左右的grid有沒有1,如果有,將它設為x,再explor(),如果上下左右都沒有1了,代表已經找完。

Pseudocode:

Main:
for each element in grid,
    if current element is 1
        counter++
        explore(grid,element,size of grid)
return counter

explore():
int dir list all directions, up, down, left, right
set current element on grid to 'x'
for each neighbor
    get neighbor's index
    if current neighbor is 1
        explore(grid, current neighbor, size of grid)

完整程式碼:

public class Solution {
    public int numIslands(char[][] grid) {
        int m = grid.length;
        if (m==0) return 0;
        int n = grid[0].length;
        int count = 0;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j]=='1'){
                    count++;
                    explore(grid, i, j, m, n);
                }
            }
        }
        return count;
    }

    public void explore(char[][] grid, int x, int y, int m, int n){
        int dir[][] = {{-1,0},{1,0},{0,-1},{0,1}};
        grid[x][y] = 'x';
        for(int i=0; i<dir.length; i++){
            int a = x + dir[i][0];
            int b = y + dir[i][1];
            if(a>=0 && a<m && b>=0 && b<n){
                if(grid[a][b]=='1'){
                    explore(grid, a, b, m, n);
                }
            }
        }
    }

}

results matching ""

    No results matching ""