LeetCode 200. 岛屿数量 (DFS)

题目链接:https://leetcode-cn.com/problems/number-of-islands/

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1
示例 2:

输入:
11000
11000
00100
00011

输出: 3

 1 int dx[4]={1,-1,0,0};
 2 int dy[4]={0,0,1,-1}; 
 3 void dfs(char** grid, int gridSize, int* gridColSize,int x,int y)
 4 {
 5     int i,j;
 6     for(i=0;i<4;i++){
 7         int nx=x+dx[i],ny=y+dy[i];
 8         if(nx>=0&&nx<gridSize&&ny>=0&&ny<gridColSize[0]&&grid[nx][ny]=='1'){
 9             grid[nx][ny]='0';
10             dfs(grid,gridSize,gridColSize,nx,ny);
11         }
12     }
13     return ;
14 }
15 int numIslands(char** grid, int gridSize, int* gridColSize){ 
16     int i,j,res=0;
17     for(i=0;i<gridSize;i++){
18         for(j=0;j<gridColSize[0];j++){
19             if(grid[i][j]=='1'){
20                 dfs(grid,gridSize,gridColSize,i,j);
21                 res++;
22             }
23         }
24     }
25     return res;   
26 }

 DFS栈实现:

 1 class Solution {
 2 public:
 3     typedef pair<int,int> P;
 4     int N,M;
 5     int dx[4]={1,0,0,-1};
 6     int dy[4]={0,-1,1,0};
 7     int x,y,nx,ny;
 8     int numIslands(vector<vector<char>>& grid) {
 9         if(grid.size()==0) return 0;
10         int res=0;
11         N=grid.size(),M=grid[0].size();
12         for(int i=0;i<N;i++){
13             for(int j=0;j<M;j++){
14                 if(grid[i][j]=='1'){
15                     res++;
16                     int sx=i,sy=j;
17                     stack<P> st;
18                     st.push(P(sx,sy));
19                     while(!st.empty()){
20                         P p=st.top();
21                         st.pop();
22                         x=p.first,y=p.second;
23                         for(int i=0;i<4;i++){
24                             nx=x+dx[i],ny=y+dy[i];
25                             if(nx>=0&&nx<N&&ny>=0&&ny<M&&grid[nx][ny]=='1'){
26                                 grid[nx][ny]='0';
27                                 st.push(P(nx,ny));
28                             }
29                         }
30                     }
31                 }
32             }
33         }
34         return res;
35     }
36 };

 c++

 1 class Solution {
 2 public:
 3     int n,m,i,j;
 4     void dfs(vector<vector<char>>& grid,int x,int y)
 5     {
 6         if(x<0||x>=n||y<0||y>=m||grid[x][y]=='0') return;
 7         grid[x][y]='0';
 8         dfs(grid,x+1,y);
 9         dfs(grid,x-1,y);
10         dfs(grid,x,y+1);
11         dfs(grid,x,y-1);
12     }
13     int numIslands(vector<vector<char>>& grid) {
14         if(grid.size()==0) return 0;
15         n=grid.size(),m=grid[0].size();
16         int cnt=0;
17         for(i=0;i<n;i++){
18             for(j=0;j<m;j++){
19                 if(grid[i][j]=='1'){
20                     cnt++;
21                     dfs(grid,i,j);
22                 }
23             }
24         }
25         return cnt;
26     }
27 };

 

posted @ 2020-03-12 23:34  wydxry  阅读(230)  评论(0编辑  收藏  举报
Live2D