leetcode 200 岛屿数量

深度优先搜索的想法,针对一个无向图,对这一图进行遍历,遇到一个‘1’就进行深度优先搜索,遇到的‘1’都变成‘0’,代表这一个岛屿已经被记录。岛屿的数量就是进行搜索的次数,贴代码

class Solution {
private:
    void dfs(vector<vector<char>>& grid,int x,int y)
    {
        int m = grid.size();
        int n = grid[0].size();
        grid[x][y] = '0';
        if(x-1>=0 && grid[x-1][y] == '1') dfs(grid,x-1,y);
        if(x+1<m && grid[x+1][y] == '1') dfs(grid,x+1,y);
        if(y-1>=0 && grid[x][y-1] == '1') dfs(grid,x,y-1);
        if(y+1<n && grid[x][y+1] == '1') dfs(grid,x,y+1);
    }
public:
    int numIslands(vector<vector<char>>& grid) 
    {
        int m = grid.size();
        if(!m)
        return 0;
        int n = grid[0].size();
        int num = 0;
        for(int i = 0 ; i < m ; i++)
        {
            for(int j = 0 ; j < n ; j++)
            {
                if(grid[i][j] == '1')
                {
                    num++;
                    dfs(grid,i,j);
                }
            }
        }
        return num;
    }
};

广度优先搜索,单次搜索中,通过队列才存储所有周边的‘1’,每搜索到一个‘1’,就将其存入队列中,继续进行搜索,直到队列中元素清空。

 1 class Solution {
 2 public:
 3     int numIslands(vector<vector<char>>& grid) 
 4     {
 5         int m = grid.size();
 6         int n = grid[0].size();
 7         int nums = 0;
 8         for(int i = 0 ; i < m ; i++)
 9         {
10             for(int j = 0 ; j < n ; j++)
11             {
12                 if(grid[i][j] == '1')
13                 {
14                     nums++;
15                     grid[i][j] = '0';
16                     queue<pair<int,int>> neibor;
17                     neibor.push({i,j});
18                     while(!neibor.empty())
19                     {
20                         auto temp = neibor.front();
21                         neibor.pop();
22                         int x = temp.first;
23                         int y = temp.second;
24                         if(x-1>=0 && grid[x-1][y] == '1')
25                         {
26                             neibor.push({x-1,y});
27                             grid[x-1][y] = '0';
28                         }
29                         if(x+1<m && grid[x+1][y] == '1')
30                         {
31                             neibor.push({x+1,y});
32                             grid[x+1][y] = '0';
33                         }
34                         if(y-1>=0 && grid[x][y-1] == '1')
35                         {
36                             neibor.push({x,y-1});
37                             grid[x][y-1] = '0';
38                         }
39                         if(y+1<n && grid[x][y+1] == '1')
40                         {
41                             neibor.push({x,y+1});
42                             grid[x][y+1] = '0';
43                         }
44                     } 
45                 }
46             }
47         } 
48         return nums; 
49     }
50 };

 

posted @ 2021-08-19 19:57  zhaohhhh  阅读(35)  评论(0)    收藏  举报