本文涉及知识点
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);
}