本文涉及知识点
C++BFS算法
LeetCode1020. 飞地的数量
给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。
一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。
返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。
示例 1:
输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
示例 2:
输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:所有 1 都在边界上或可以到达边界。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 500
grid[i][j] 的值为 0 或 1
BFS
统计1的数量cnt1,将能够到达边界的1放到v中。返回值:cnt1-v.size()。
BFS的状态表示:leves[i]记录通过i个陆地单格可以到达边界的陆地单格。
BFS的后续状态:通过vNeiBo[r][c]枚举和(r,c)相邻且为1的单格。
BFS的初始状态:边界上的单格。
BFS的返回值:无。
BFS出重处理:二维数组出重。
源码
核心源码
class Solution {public:int numEnclaves(vector<vector<int>>& grid) {m_r = grid.size();m_c = grid[0].size();vector<vector<pair<int,int>>> neiBo(m_c * m_r);auto Add = [&](int r,int c, int r1, int c1) {if ((r1 < 0) || (r1 >= m_r)) { return; }if ((c1 < 0) || (c1 >= m_c)) { return; }// if (0 == grid[r][c]) { return; }if (0 == grid[r1][c1]) { return; }neiBo[Mask(r, c)].emplace_back(std::make_pair(r1, c1));};for (int r = 0; r < m_r; r++) {for (int c = 0; c < m_c; c++) {Add(r, c, r + 1, c);Add(r, c, r - 1, c);Add(r, c, r , c + 1);Add(r, c, r, c -1);}}queue<pair<int, int>> que;int cnt1 = 0;vector<bool> vis(m_r * m_c);for (int r = 0; r < m_r; r++) {for (int c = 0; c < m_c; c++) {if (0 == grid[r][c]) { continue; }cnt1++;if ((0 == r) || (0 == c) || (r + 1 == m_r) || (c + 1 == m_c)) {que.emplace(make_pair(r, c));vis[Mask(r, c)] = true;}}}while (que.size()) {const auto [r, c] = que.front();que.pop();const int iMask = Mask(r, c);for (const auto& [r1,c1] : neiBo[iMask]) {if (vis[Mask(r1,c1)]) { continue; }vis[Mask(r1, c1)] = true;que.emplace(r1, c1);}}return cnt1 - count(vis.begin(), vis.end(), true);}int Mask(int r, int c) { return m_c * r + c; }int m_r,m_c;};
单元测试
vector<vector<int>> grid;TEST_METHOD(TestMethod1){grid = { {0,0,0,0},{1,0,1,0},{0,1,1,0},{0,0,0,0} };auto res = Solution().numEnclaves(grid);AssertEx(3, res);}TEST_METHOD(TestMethod2){grid = { {0,1,1,0},{0,0,1,0},{0,0,1,0},{0,0,0,0} };auto res = Solution().numEnclaves(grid);AssertEx(0, res);}TEST_METHOD(TestMethod3){grid = { {0,1,0},{0,1,0},{0,0,0} };auto res = Solution().numEnclaves(grid);AssertEx(0, res);}TEST_METHOD(TestMethod4){grid = { {0,0,0},{0,1,0},{0,1,0} };auto res = Solution().numEnclaves(grid);AssertEx(0, res);}TEST_METHOD(TestMethod5){grid = { {0,0,0},{1,1,0},{0,0,0} };auto res = Solution().numEnclaves(grid);AssertEx(0, res);}TEST_METHOD(TestMethod6){grid = { {0,0,0},{0,1,1},{0,0,0} };auto res = Solution().numEnclaves(grid);AssertEx(0, res);}TEST_METHOD(TestMethod7){grid = { {0,0,0,0,0},{1,0,1,0,0},{0,0,0,0,0} };auto res = Solution().numEnclaves(grid);AssertEx(1, res);}
扩展阅读
我想对大家说的话 |
---|
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。 |
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作 |
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注 |
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。 |
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
如果程序是一条龙,那算法就是他的是睛 |
失败+反思=成功 成功+反思=成功 |
视频课程
先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176
测试环境
操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。