zoukankan      html  css  js  c++  java
  • [刷题] 200 Number of Islands

    要求

    • 给定一个二维数组,只有0和1两个字符,1代表陆地,0代表水域,纵向和横向的陆地连接成岛屿,被水域隔开,求出地图中有多少岛屿

    思路

    • 对要查找的区域进行双重循环遍历,寻找陆地
    • 从陆地初始点开始进行深度优先遍历
    • 如:从(0,0)开始深度遍历,填充岛屿,(0,1)已经访问过,(0,2)为水域,直到(2,2)再开始深度遍历

    实现

    • res:有多少个岛屿
    • 递归条件:在区域内,未被访问过,是陆地
    • 终止条件融入到了if语句中
     1 class Solution {
     2 
     3 private:
     4     int d[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
     5     int m,n;
     6     vector<vector<bool>> visited;
     7     
     8     bool inArea( int x, int y){
     9         return x >= 0 && x < m && y >= 0 && y < n;
    10     }    
    11     
    12     // 从grid[x][y]开始,进行floodfill 
    13     // 保证(x,y)合法,且grid[x][y]是没有被访问过的陆地 
    14     void dfs( vector<vector<char>>& grid, int x, int y ){
    15         
    16         visited[x][y] = true;
    17         for( int i = 0 ; i < 4 ; i ++ ){
    18             int newx = x + d[i][0];
    19             int newy = y + d[i][1];
    20             // if语句保证访问合法,不需再写递归终止条件 
    21             if( inArea(newx, newy) && !visited[newx][newy] && grid[newx][newy] == '1')
    22                 dfs( grid, newx, newy );
    23         }
    24         return;
    25     }
    26     
    27 public:
    28     int numIslands(vector<vector<char>>& grid) {
    29         m = grid.size();
    30         if( m == 0 )
    31             return 0;
    32         n = grid[0].size();
    33         
    34         visited = vector<vector<bool>>(m, vector<bool>(n,false));
    35         
    36         int res = 0;
    37         for( int i = 0 ; i < m ; i ++ )
    38             for( int j = 0 ; j < n ; j ++ )
    39             if( grid[i][j] == '1' && !visited[i][j] ){
    40                 res ++;
    41                 dfs( grid, i, j );
    42             }
    43         return res;
    44     }
    45 };
    View Code

    相关

    • 130 Surrounded Regions
    • 417 Pacific Atlantic Water Flow
  • 相关阅读:
    六种排序
    洛谷 P1879 [USACO06NOV]玉米田Corn Fields
    [USACO06NOV]玉米田Corn Fields
    c++位运算符 | & ^ ~ && ||,补码,反码
    Blockade(Bzoj1123)
    割点(Tarjan算法)【转载】
    子串
    生命是什么
    怎样说话才打动人
    自控力
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12710920.html
Copyright © 2011-2022 走看看