原题:
https://leetcode-cn.com/problems/number-of-islands/
class Solution {
public:
int numIslands(vector<vector<char>>& 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';
//定义一个队列,用于存放下标信息
//注意对pair的理解,可以看作是内部有两个元素的结构体
queue<pair<int, int>> neighbors;
neighbors.push({r, c});//将'1'的下标信息入队
while (!neighbors.empty()) {
pair<int,int> rc = neighbors.front();//访问队首元素
neighbors.pop();//队首元素出队
int row = rc.first;//队首元素所对应的行号
int col = rc.second;//队首元素所对应的列号
//将它上下左右的‘1’都同化成‘0’
//上
//row - 1 >= 0 判断位置是否合法
if (row - 1 >= 0 && grid[row-1][col] == '1') {
neighbors.push({row-1, col});
grid[row-1][col] = '0';
}
//下
//row + 1 < nr 判断位置是否合法
if (row + 1 < nr && grid[row+1][col] == '1') {
neighbors.push({row+1, col});
grid[row+1][col] = '0';
}
//左
//col - 1 >= 0 判断位置是否合法
if (col - 1 >= 0 && grid[row][col-1] == '1') {
neighbors.push({row, col-1});
grid[row][col-1] = '0';
}
//右
//col + 1 < nc 判断位置是否合法
if (col + 1 < nc && grid[row][col+1] == '1') {
neighbors.push({row, col+1});
grid[row][col+1] = '0';
}
}
}
}
}
return num_islands;
}
};