FLASH 坏块监测系统
题目描述
开发一个 FLASH 坏块监测系统,能够监测 FLASH 中坏块的数量。FLASH 介质以一个大小为 m×n 的二维二进制矩阵表示,其中:0 表示正常,1 表示异常。最初,FLASH 介质中的所有单元格都是正常(即,所有单元格都是 0)。 系统运行过程中,FLASH 坏块不断产生:随着系统持续运行,某一个时刻 i,FLASH 介质中的某个单元格 (ri,ci) 由正常变为异常。返回一个整数数组 result,其中 result[i] 是 FLASH 介质中第 i 个时刻 (ri,ci) 位置变为异常后,FLASH 中坏块的数量。坏块的定义:坏块是由 4 个方向相连的异常单元格组成的'极大'连通块。你可以假设给定的 FLASH 介质外的所有点都是正常的。
输入描述
第一行输入和第二行输入分别为 m 和 n,表示 FLASH 介质是 m×n 的二维二进制矩阵。 第三行开始的每一行表示第 i 个时刻新增的异常位置 (ri,ci),最多 1000 个操作。
注意:
- 1 ≤ m, n ≤ 10^3
- 坐标范围在 [0, m-1] × [0, n-1] 内
- 操作次数不超过 1000
输出描述
返回一个整数数组 result,其中 result[i] 是 FLASH 介质中第 i 个时刻 (ri,ci) 位置变为异常后,FLASH 中坏块的数量。
示例
输入:
3 3
0 0
1 1
2 2
输出:
[1, 2, 3]
(注:此处为示意,实际需根据具体连通性计算)
解题思路
本题属于动态图连通性问题。每当有一个新节点被激活(从 0 变为 1),我们需要判断它是否与周围已存在的 1 连通。如果连通,则合并集合;如果不连通,则增加新的连通分量数量。 推荐使用并查集(Union-Find)数据结构来维护连通块。
- 初始化时,所有格子均为 0,连通块数量为 0。
- 每次更新 (r, c) 为 1 时,检查其上下左右四个邻居。
- 若邻居也是 1,则执行 Union 操作。
- 统计当前连通块总数即为结果。
代码实现 (C++)
#include <iostream>
#include <vector>
using namespace std;
class UnionFind {
public:
vector<int> parent;
int count;
UnionFind(int size) : parent(size), count(0) {
for(int i=0; i<size; ++i) parent[i] = i;
}
{
(parent[x] != x) parent[x] = (parent[x]);
parent[x];
}
{
rootX = (x);
rootY = (y);
(rootX != rootY) {
parent[rootX] = rootY;
count--;
}
}
};
{
m, n;
cin >> m >> n;
;
}


