200. Number of Islands

问题:

给定数组0代表海水,1代表陆地,若陆地上下左右皆为海水,那么则称该陆地为一小岛。

求给定数组中有多少小岛。

Example 1:
Input:
11110
11010
11000
00000

Output: 1


Example 2:
Input:
11000
11000
00100
00011

Output: 3

  

解法:

图的DFS,深度优先搜索。

遍历图,

若遇到小岛陆地‘1’,则发现新岛,res++,并由此点DFS,(上下左右四个方向)遍历全岛,标记为0,即沉掉整座岛。

之后再发现新岛陆地‘1’,则为新岛。

代码参考:

 1 class Solution {
 2 public:
 3     void visited(int i, int j, int m, int n, vector<vector<char>>& grid){
 4         if(i<0 || i>=n || j<0 || j>=m || grid[i][j]=='0') return;
 5         grid[i][j]='0';
 6         visited(i-1,j,m,n,grid);
 7         visited(i+1,j,m,n,grid);
 8         visited(i,j-1,m,n,grid);
 9         visited(i,j+1,m,n,grid);
10         return;
11     }
12     int numIslands(vector<vector<char>>& grid) {
13         int i, j, n, m;
14         int res=0;
15         n=grid.size();
16         if(n==0) return 0;
17         m=grid[0].size();
18         for(i=0; i<n; i++){
19             for(j=0; j<m; j++){
20                 if(grid[i][j]=='1'){
21                     res++;
22                     visited(i, j, m, n, grid);
23                 }
24             }
25         }
26         return res;
27     }
28 };
原文地址:https://www.cnblogs.com/habibah-chang/p/12802652.html