[刷题] 200 Number of Islands

Posted cxc1357

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[刷题] 200 Number of Islands相关的知识,希望对你有一定的参考价值。

要求

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

思路

  • 从初始点开始进行深度优先遍历
  • 从一点开始遍历,像洪水泛滥

技术图片

实现

技术图片
 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

以上是关于[刷题] 200 Number of Islands的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题记录[java]——695 Max Area of Island

python 学习 leetcode ---number of island

Number of Islands

[LeetCode] 694. Number of Distinct Islands

694. Number of Distinct Islands - Medium

[LC] 694. Number of Distinct Islands