【C++算法】81.BFS解决FloodFill算法_岛屿的最大面积
文章目录
- 题目链接:
- 题目描述:
- 解法
- C++ 算法代码:
题目链接:
695. 岛屿的最大面积
题目描述:
解法
BFS一层层剥开。
要统计所有连通块的最大面积。
当遇到第一个没有遍历过的1的时候,相当于找到一块陆地,同时要搞一个变量count来统计面积。
C++ 算法代码:
class Solution {// 定义四个方向的偏移量:右、左、下、上int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};// 标记数组,记录每个位置是否被访问过bool vis[51][51];// 网格的行数和列数int m, n;public:// 主函数:计算最大岛屿面积int maxAreaOfIsland(vector<vector<int>>& grid) {// 获取网格的行数和列数m = grid.size(), n = grid[0].size();int ret = 0; // 记录最大岛屿面积// 遍历整个网格for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 如果当前位置是陆地且未被访问过if (grid[i][j] == 1 && !vis[i][j]) {// 更新最大面积ret = max(ret, bfs(grid, i, j));}}}return ret; // 返回最大岛屿面积}// BFS辅助函数:计算并返回以(i,j)为起点的岛屿面积int bfs(vector<vector<int>>& grid, int i, int j) {int count = 0; // 记录当前岛屿的面积queue<pair<int, int>> q; // 创建队列用于BFSq.push({i, j}); // 将起点加入队列vis[i][j] = true; // 标记为已访问count++; // 面积加1while (q.size()) {auto [a, b] = q.front(); // 取出队首元素q.pop();// 遍历四个方向for (int k = 0; k < 4; k++) {int x = a + dx[k], y = b + dy[k]; // 计算新坐标// 检查新坐标是否有效if (x >= 0 && x < m && y >= 0 && y < n && // 边界检查grid[x][y] == 1 && // 是陆地!vis[x][y]) { // 未访问过q.push({x, y}); // 加入队列vis[x][y] = true; // 标记为已访问count++; // 面积加1}}}return count; // 返回当前岛屿的面积}
};