岛屿数量

题目描述

给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:
输入:
11110
11010
11000
00000

输出: 1
示例 2:
输入:
11000
11000
00100
00011

输出: 3
题目意思

刚开始看到这道题的描述的时候,其实我是一脸懵逼的,因为完全没看懂它的意思,更不明白示例1的输出是从哪里来的,后来看到最后一句你可以假设网格的四个边均被水包围,我才有点明白。岛屿并不一定是规整的,示例1和2的岛屿数量和形状正如我圈出来的一样。
岛屿数量

解题代码

在这里我是借鉴的别人的解题思路,所以就不把自己的代码po出来了,这里直接外链到我借鉴的地方,有兴趣的可以自行转移。岛屿数量解题代码

BFS(宽度优先搜索)通常用于图论中的遍历算法,特别是在寻找连通分量、路径或最小生成树等问题时。在查找岛屿数量时,你可以将其视为一个二维网格,其中'0'表示水域,'1'表示陆地。岛屿就是由相邻的陆地区域组成的,且四周边界也是陆地。 这里是一个简单的C++实现,使用BFS来计算字符串表示的二维数组中岛屿数量: ```cpp #include <iostream> #include <queue> #include <string> int countIslands(const std::string& grid) { int m = grid.size(), n = grid[0].size(); int islands_count = 0; bool visited[m][n]; // 初始化为未访问 for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j) visited[i][j] = false; // 定义队列并开始 BFS std::queue<std::pair<int, int>> q; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == '1' && !visited[i][j]) { islands_count++; q.push({i, j}); visited[i][j] = true; } } } while (!q.empty()) { int x = q.front().first, y = q.front().second; q.pop(); // 检查上下左右四个方向 if (x > 0 && grid[x - 1][y] == '1' && !visited[x - 1][y]) q.push({x - 1, y}), visited[x - 1][y] = true; if (x < m - 1 && grid[x + 1][y] == '1' && !visited[x + 1][y]) q.push({x + 1, y}), visited[x + 1][y] = true; if (y > 0 && grid[x][y - 1] == '1' && !visited[x][y - 1]) q.push({x, y - 1}), visited[x][y - 1] = true; if (y < n - 1 && grid[x][y + 1] == '1' && !visited[x][y + 1]) q.push({x, y + 1}), visited[x][y + 1] = true; } return islands_count; } int main() { std::string grid = "010010000010"; int islandCount = countIslands(grid); std::cout << "Number of islands: " << islandCount << std::endl; return 0; } ``` 在这个代码里,我们首先初始化一个`visited`数组记录每个位置是否已被访问过。然后,对每个格子进行检查,如果它是陆地且还未被访问,则标记为已访问,并增加岛屿计数。接着,我们用队列进行广度优先搜索,每次从队列中取出一个位置,然后在其周围四邻位置上重复此过程,直到所有可达的陆地都被处理过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值