岛屿的最大面积

题目

给定一个包含了一些 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;
}

猜你喜欢

转载自blog.csdn.net/ILUU121/article/details/85015259