zoukankan      html  css  js  c++  java
  • LeetCode 695 岛屿的最大面积

    题目:

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

    解题思路:

    深度优先搜索。以grid为1的坐标为中心,分别向上下左右四个方向进行搜索,这里注意边界条件:四个方向的坐标应该在grid矩阵内。

    代码:

     1 class Solution {
     2 public:
     3     int cnt;
     4     int c,k;
     5     int maxArea = 0;
     6     int maxAreaOfIsland(vector<vector<int>>& grid) {
     7         vector<vector<bool>> visited;
     8         
     9         c = grid.size();
    10         k = grid[0].size();
    11         visited.resize(c);
    12         for(int i=0; i<c; i++)    //visited数组初始化,对于本题可以直接用grid作为访问标记。
    13             visited[i].resize(k);
    14         for(int i=0; i<c; ++i)
    15             for(int j=0; j<k; ++j){
    16                 visited[i][j] = false;
    17             }
    18         
    19         for(int i=0; i<c; ++i)
    20             for(int j=0; j<k; ++j) {
    21                 if(!visited[i][j] && grid[i][j]) {
    22                     cnt = 1;
    23                     DFS(grid,i,j,visited);
    24                     maxArea = max(maxArea, cnt); 
    25                 }
    26             }
    27         return maxArea;
    28     }
    29     
    30     void DFS(vector<vector<int>> &grid, int i,int j, vector<vector<bool>> &visited) {
    31         visited[i][j] = true;
    32         //以下进行上下左右搜索
    33         if(i+1 < c && !visited[i+1][j] && grid[i+1][j] ) {
    34             cnt++;
    35             DFS(grid,i+1,j,visited);
    36             
    37         }
    38         if(i-1>=0 && !visited[i-1][j] && grid[i-1][j]) {
    39             cnt++;
    40             DFS(grid, i-1, j, visited);
    41             
    42         }
    43         if(j+1<k && !visited[i][j+1] && grid[i][j+1]) {
    44             cnt++;
    45             DFS(grid,i,j+1,visited);
    46            
    47         }
    48         if(j-1>=0 && !visited[i][j-1] && grid[i][j-1]) {
    49             cnt++;
    50             DFS(grid,i,j-1,visited);
    51             
    52         }
    53     }
    54 };
  • 相关阅读:
    2013ACM多校联合(1)
    AcDream 1083 完美数 数位DP
    AcDream 1079 郭氏数
    AcDream 1084 同心树 几何
    AcDream 1078 递推数 嵌套循环节+矩阵快速幂
    AcDream 1081 平衡树 Tire树
    ZOJ1455 Schedule Problem 差分约束
    在程序中加载log4net配置,防止其他人看到配置文件
    sqlite错误 The database disk image is malformed database disk image is malformed 可解决
    由于这台计算机没有终端服务器客户端访问许可证,远程会话被中断。请与服务器管理员联系 解决
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10677458.html
Copyright © 2011-2022 走看看