超过>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;
}
这里空空如也




有帮助,赞一个