1. 程式人生 > >島嶼的最大面積

島嶼的最大面積

題目

給定一個包含了一些 0 和 1的非空二維陣列 grid , 一個 島嶼 是由四個方向 (水平或垂直) 的 1 (代表土地) 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。

找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為0。)

示例 1:

[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
對於上面這個給定矩陣應返回 6。注意答案不應該是11,因為島嶼只能包含水平或垂直的四個方向的‘1’。

示例 2:

[[0,0,0,0,0,0,0,0]]
對於上面這個給定的矩陣, 返回 0。

注意: 給定的矩陣grid 的長度和寬度都不超過 50。

我的思路

題很容易理解,關鍵在於解決問題的思維。此題,我採用的是DFS+遞迴。

參考

695 島嶼的最大面積

我的程式碼實現

//
// Created by HINTS on 2018/12/13.
//
#include <iostream>
#include <vector>
using namespace std;

//使用DFS(深度優先搜尋演算法)+遞迴實現
/**
 *
 * @param grid
 * @param x0:橫座標
 * @param y0:縱座標
 * @return
 */
int dfs(vector<vector<int >> &grid, int x0, int y0){
    int n, m, sum = 1; //當前元素設為0,所以sum初始為1。
    n = grid.size();
    m = grid[0].size();

    grid[x0][y0] = 0; //設定當前元素為0,以免再次搜尋到。

    int dir[4][2] = {{0,1},{0,-1}, {1,0},{-1,0}}; //設定上下左右四個移動方向
    for (int i = 0; i < 4; ++i) {
        //設定x,y 移動方向。
        int x = x0 + dir[i][0];
        int y = y0 + dir[i][1];
        //設定邊界條件
        if(x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 1){
            sum += dfs(grid,x,y);
        }
    }
    return sum;
}
int maxAreaOfIsland(vector<vector<int>> &grid){
    int mx = 0, n, m; //mx:面積
    n = grid.size();
    m = grid[0].size();
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if(grid[i][j] == 1){
                mx = max(dfs(grid,i, j), mx);
            }
        }

    }
    return mx;
}
int main(){
    vector<vector<int>> grid = {{0,0,1,0,0,0,0,1,0,0,0,0,0},
                                 {0,0,0,0,0,0,0,1,1,1,0,0,0},
                                 {0,1,1,0,1,0,0,0,0,0,0,0,0},
                                {0,1,0,0,1,1,0,0,1,0,1,0,0},
                                {0,1,0,0,1,1,0,0,1,1,1,0,0},
                                {0,0,0,0,0,0,0,0,0,0,1,0,0},
                                {0,0,0,0,0,0,0,1,1,1,0,0,0},
                                {0,0,0,0,0,0,0,1,1,0,0,0,0}};

    int sum = maxAreaOfIsland(grid);
    cout << sum << endl;
    return 0;
}