#include
#include
#include
using namespace std;
//深度优先搜索 官方解决方案
//class Solution {
//private:
// void dfs(vector
//{
// 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
// 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
// {
// vector
// for(int i=0;i<5;i++)//vector对于二维数组不能直接初始化,
// {
// for(int j=0;j<5;j++)
// {
// grid[i][j]=arr[i][j];
// }
// }
// }
// int numIslands(vector
// {
// 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<
// {
// for(int j=0;j<5;j++)
// {
// cout<
// }*/
// }
//private:
// vector
// void island(vector
// {
// 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
//};
//
//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
// 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
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.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.push(make_pair(a,s));//make_pair是插入方法
// cout<
//}
//并查集解法,太复杂
//class UnionFind {
//public:
// UnionFind(vector
// {
// 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
// vector
// int count; // # of connected components
//};
//class Solution {
//public:
// int numIslands(vector
// {
// 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();
// }
//};