超过>95%的时间复杂度和内存占用
2025-10-27 22:22:36
发布于:北京
5阅读
0回复
0点赞
迭代自旧版
#include <cstdio>
#include <queue>
using namespace std;
const int MAX_N = 505;
int dist[MAX_N][MAX_N];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
struct Point {
int x, y;
Point(int x_, int y_) : x(x_), y(y_) {}
};
int main() {
int n, m, a, b;
scanf("%d %d %d %d", &n, &m, &a, &b);
// 使用循环初始化替代memset
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
dist[i][j] = -1;
}
}
queue<Point> q;
// 读取感染源并初始化
for (int i = 0; i < a; ++i) {
int x, y;
scanf("%d %d", &x, &y);
if (dist[x][y] == -1) {
dist[x][y] = 0;
q.emplace(x, y);
}
}
// BFS扩散
while (!q.empty()) {
Point p = q.front();
q.pop();
int current_dist = dist[p.x][p.y];
for (int i = 0; i < 4; ++i) {
int nx = p.x + dx[i];
int ny = p.y + dy[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && dist[nx][ny] == -1) {
dist[nx][ny] = current_dist + 1;
q.emplace(nx, ny);
}
}
}
// 动态分配精确大小的内存
int* lords_x = new int[b];
int* lords_y = new int[b];
// 读取并立即输出结果,避免存储所有坐标
for (int i = 0; i < b; ++i) {
scanf("%d %d", &lords_x[i], &lords_y[i]);
printf("%d\n", dist[lords_x[i]][lords_y[i]]);
}
delete[] lords_x;
delete[] lords_y;
return 0;
}
这里空空如也




有帮助,赞一个