给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入: 11110 11010 11000 00000 输出: 1
示例 2:
输入: 11000 11000 00100 00011 输出: 3
#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int r = grid.size();
if (!r)return 0;
int c = grid[0].size();
int count = 0;
queue<pair<int, int>> q;
vector<vector<bool>>visited(r, vector<bool>(c, false));//标记是否被访问过
for(int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{//对每一个点
if (!visited[i][j])//如果没有访问过
{
visited[i][j] = true;//标记为访问过
if (grid[i][j] == '1')
{
q.push(make_pair(i, j));//该点入队
while (!q.empty())
{
int rr = q.front().first;//pair的第一个值
int cc = q.front().second;//pair的第二个值
q.pop();//队首已被赋值给rr, cc,队首出队
if (rr < r - 1 && !visited[rr + 1][cc])//向下搜索
{
visited[rr + 1][cc] = true;
if ((grid[rr + 1][cc]) == '1')//若为陆地,入队
q.push(make_pair(rr + 1, cc));
}
if (rr > 0 && !visited[rr - 1][cc])//向上
{
visited[rr - 1][cc] = true;
if ((grid[rr - 1][cc]) == '1')
q.push(make_pair(rr - 1, cc));
}
if (cc < c - 1 && !visited[rr][cc + 1])//向右
{
visited[rr][cc + 1] = true;
if ((grid[rr][cc + 1]) == '1')
q.push(make_pair(rr, cc + 1));
}
if (cc > 0 && !visited[rr][cc - 1])//向左
{
visited[rr][cc - 1] = true;
if ((grid[rr][cc - 1]) == '1')
q.push(make_pair(rr, cc - 1));
}
}
count++;
}
}
}
}
return count;
}
};
队列和bfs:https://leetcode-cn.com/explore/learn/card/queue-stack/217/queue-and-bfs/869/