岛屿数量(回溯法进行污染)详细解答

#include
#include
#include
using namespace std;
//深度优先搜索  官方解决方案

//class Solution {
//private:
//  void dfs(vector>& grid, int r, int c)
//{
//    int nr = grid.size();
//    int nc = grid[0].size();
//
//    grid[r][c] = '0';
//    if (r - 1 >= 0 && grid[r-1][c] == '1') dfs(grid, r - 1, c);
//    if (r + 1 < nr && grid[r+1][c] == '1') dfs(grid, r + 1, c);
//    if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1);
//    if (c + 1 < nc && grid[r][c+1] == '1') dfs(grid, r, c + 1);
//  }
//
//public:
//  int numIslands(vector>& grid) {
//    int nr = grid.size();grid的大小
//    if (!nr) return 0;//判断是否为空
//    int nc = grid[0].size();一行有多大
//    int num_islands = 0;
//    for (int r = 0; r < nr; ++r) {  r是行数
//      for (int c = 0; c < nc; ++c) {
//        if (grid[r][c] == '1') {
//          ++num_islands;
//          dfs(grid, r, c);
//        }
//      }
//    }
//
//    return num_islands;
//  }
//};

2、
//自己写的
//class Solution {
//public:
//    Solution(vector>&arr)
//    {
//        vector>grid(5,vector(5));
//        for(int i=0;i<5;i++)//vector对于二维数组不能直接初始化,
//        {
//            for(int j=0;j<5;j++)
//            {
//                grid[i][j]=arr[i][j];
//            }
//        }
//    }
//    int numIslands(vector>& grid) 
//    {
//        int size=grid.size();//有多少分组
//        if(size==0)return 0;
//        int column=grid[0].size();//每一组有多少个
//        int numofisland=0;
//        for(int l=0;l //        {
//            for(int c=0;c //            {
//                if(grid[l][c]==1)
//                {
//                    numofisland++;
//                    island(grid,l,c);
//                }
//            }
//        }
//        cout< //        /*cout< //        for(int i=0;i<5;i++)
//        {
//            for(int j=0;j<5;j++)
//            {
//                cout< //            }
//        }*/
//    }
//private:
//    vector>grid();
//    void island(vector>& grid,int l,int c)
//    {
//        grid[l][c]=0;
//        int size=grid.size();
//        int column=grid[0].size();
//        if(l-1>0&&grid[l-1][c]==1)island(grid,l-1,c);
//        if(l+1 //        if(c-1>0&&grid[l][c-1]==1)island(grid,l,c-1);
//        if(c+1 //    }
//};
//
//int main()
//{
//    int brr[5][5]={{1,1,1,1,0},{1,1,0,1,0},{1,1,0,0,0},{0,0,0,0,0}};
//    vector>arr(5,vector(5));
//    for(int i=0;i<5;i++)//vector对于二维数组不能直接初始化,
//    {
//            for(int j=0;j<5;j++)
//            {
//                arr[i][j]=brr[i][j];
//            }
//    }
//    Solution A(arr);
//    A.numIslands(arr);
//}

3、

//广度优先搜索
#if(0)
class Solution 
{
 public:
  int numIslands(vector>& grid) {
    int nr = grid.size();  // 多少分组
    if (!nr) return 0;     // 判断数组是否为空
    int nc = grid[0].size();//每组个数
    int num_islands = 0;    //岛屿数量
    for (int r = 0; r < nr; ++r) {
      for (int c = 0; c < nc; ++c) {
        if (grid[r][c] == '1') {
          ++num_islands;
          grid[r][c] = '0'; // mark as visited  标记为已访问(用‘0’标记)
          queue> nei***ors; // 定义一个双属性队列
          nei***ors.push({r, c});
          while (!nei***ors.empty())// 直至岛屿合并完毕队列为空,才会继续进行遍历
          {  //队列为空empty返回1,队列不为空进行while
            auto rc = nei***ors.front();//叫系统分配变量类型,且分配队列第一个元素
            nei***ors.pop();           //第一个出队列
            int row = rc.first, col = rc.second;  //第几分组   在组中是第几
//找到一个‘1’时把附近各种情况插入到队列里,在队列里面进行合并岛屿,其他‘1’变成零
            if (row - 1 >= 0 && grid[row-1][col] == '1') {
              nei***ors.push({row-1, col}); grid[row-1][col] = '0';
            }
            if (row + 1 < nr && grid[row+1][col] == '1') {
              nei***ors.push({row+1, col}); grid[row+1][col] = '0';
            }
            if (col - 1 >= 0 && grid[row][col-1] == '1') {
              nei***ors.push({row, col-1}); grid[row][col-1] = '0';
            }
            if (col + 1 < nc && grid[row][col+1] == '1') {
              nei***ors.push({row, col+1}); grid[row][col+1] = '0';
            }
          }
        }
      }
    }

    return num_islands;
};
#endif

一个小知识点
//pair 的使用方法

//int main()
//{
//    int a=1;
//    char s='a';
//    queue>arr;//队列里放的是 pair类
//    arr.push(make_pair(a,s));//make_pair是插入方法
//    cout< //
//}

//并查集解法,太复杂

//class UnionFind {
//public:
//  UnionFind(vector>& grid) 
//  {
//    count = 0;
//    int m = grid.size();
//    int n = grid[0].size();
//      for (int i = 0; i < m; ++i) 
//      {
//        for (int j = 0; j < n; ++j)
//        {
//          if (grid[i][j] == '1') 
//          {
//            parent.push_back(i * n + j);
//            ++count;
//          }
//          else 
//              parent.push_back(-1);
//          rank.push_back(0);
//        }
//    }
//  }
//  int find(int i) 
//  { // path compression  通路压缩
//    if (parent[i] != i) 
//        parent[i] = find(parent[i]);
//    return parent[i];
//  }
//  void Union(int x, int y) 
//  { // union with rank   与rank结合
//    int rootx = find(x);
//    int rooty = find(y);
//    if (rootx != rooty)
//    {
//      if (rank[rootx] > rank[rooty]) 
//          parent[rooty] = rootx;
//      else if (rank[rootx] < rank[rooty]) 
//          parent[rootx] = rooty;
//      else 
//      {
//        parent[rooty] = rootx; rank[rootx] += 1;
//      }
//      --count;
//    }
//  }
//
//  int getCount() const 
//  {
//    return count;
//  }
//private:
//  vector parent;
//  vector rank;
//  int count; // # of connected components
//};
//class Solution {
//public:
//  int numIslands(vector>& grid) 
//  {
//    int nr = grid.size();
//    if (!nr)
//        return 0;
//    int nc = grid[0].size();
//
//    UnionFind uf (grid);
//    int num_islands = 0;
//    for (int r = 0; r < nr; ++r) 
//    {
//      for (int c = 0; c < nc; ++c) 
//      {
//        if (grid[r][c] == '1') 
//        {
//          grid[r][c] = '0';
//          if (r - 1 >= 0 && grid[r-1][c] == '1') uf.Union(r * nc + c, (r-1) * nc + c);
//          if (r + 1 < nr && grid[r+1][c] == '1') uf.Union(r * nc + c, (r+1) * nc + c);
//          if (c - 1 >= 0 && grid[r][c-1] == '1') uf.Union(r * nc + c, r * nc + c - 1);
//          if (c + 1 < nc && grid[r][c+1] == '1') uf.Union(r * nc + c, r * nc + c + 1);
//        }
//      }
//    }
//    return uf.getCount();
//  }
//};

你可能感兴趣的:(C++代码)