洛谷P1141题解:01迷宫连通块问题的BFS解法

一、问题分析
题目要求在一个由0和1组成的n×n迷宫中,对于给定的m个查询点,快速回答从该点出发能移动到的格子总数。移动规则是只能移动到相邻且数字不同的格子。
二、算法核心思路
三、完整代码实现(带注释)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 方向数组:上、下、左、右
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
int main() {
ios::sync_with_stdio(false); // 加速输入输出
cin.tie(nullptr); // 解除cin与cout的绑定
int n, m;
cin >> n >> m;
// 读取迷宫,注意题目行列从1开始
vector<vector<char>> grid(n+2, vector<char>(n+2));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cin >> grid[i][j];
}
}
// 连通块标记和大小统计
vector<vector<int>> component(n+2, vector<int>(n+2, 0));
vector<int> component_size(1); // 从1开始计数
int current_component = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (component[i][j] == 0) {
current_component++;
queue<pair<int, int>> q;
q.push({i, j});
component[i][j] = current_component;
int size = 1;
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (int k = 0; k < 4; ++k) {
int nx = x + dx[k];
int ny = y + dy[k];
// 检查边界、未访问且数字相反
if (nx >= 1 && nx <= n && ny >= 1 && ny <= n &&
component[nx][ny] == 0 &&
grid[nx][ny] != grid[x][y]) {
component[nx][ny] = current_component;
size++;
q.push({nx, ny});
}
}
}
component_size.push_back(size);
}
}
}
// 处理查询
while (m--) {
int x, y;
cin >> x >> y;
cout << component_size[component[x][y]] << "\n";
}
return 0;
}四、调试技巧
使用小规模测试用例验证连通块计算
检查边界条件处理是否正确
验证方向数组是否覆盖所有可能移动方向
确保连通块大小统计准确
原创内容 转载请注明出处
