200. 岛屿数量(C++题解版含VS可运行源程序)
1.题解
(1)BFS,广度优先遍历,非递归
- 遍历二维网格,如果遇到值为1的网格则加入队列进行广度优先搜索;
- 并将搜索过程中遇到的1变为0;
- 这样广度优先搜索的次数就是岛屿的数量。
(2)DFS,深度优先遍历,递归
- 遍历二维网格,如果网格值为“1”则以该网格为起点进行深度优先遍历,
- 在搜索过程中值为1的网格都置为“0”。
- 这样深度优先搜索的次数就是岛屿的数量。
2.力扣C++源码
(1)BFS,广度优先遍历,非递归
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
/**
思路:1.这里我们使用的是BFS(广度优先搜索遍历)
2.当我们遇到一个岛屿('1')的时候,我们就对其的左右四边进行广度遍历
并且标记已经访问过的结点。
3.那么我们每次遇到一个1开始广度遍历那就证明我们发现了一个岛
*/
int m = grid.size(); //表示矩阵的行
int n = grid[0].size();// //表示矩阵的列
int num_islands = 0;//表示岛屿的数量
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
queue<pair<int, int> >q;//创建一个队列,可以存两个值(行和列)
if (grid[i][j] == '1') {
q.push({
i,j });
grid[i][j] = '0';//访问过的话,将其设置为 0
num_islands++;
}
while (!q.empty()) {
auto temp = q.front();//这里的auto可以表示任何类型,所以当然包括我们的一个集合
q.pop();
int nr = temp.first;//集合的第一个元素(行)
int nc = temp.second;//集合的第二个元素(列)
//接下来看该位置的四周的值是否为1,为1的话那么接下来就扩大 岛屿的值
//该位置的上方
if (nr - 1 >= 0 && grid[nr - 1][nc] == '1') {
q.push({
nr - 1,nc });
grid[nr - 1][nc] = '0';
}
//该位置的下方(这里小于 m,是因为我们的二维矩阵边界行的最大值为 m - 1 指的是在二维矩阵中的下标)
if (nr + 1 < m && grid[nr + 1