题解 内存和时间复杂度超过>=80%用户
2025-10-27 22:14:06
发布于:北京
3阅读
0回复
0点赞
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
//666剧情——无需惊讶,你就是那个叛徒。在你的行踪败露之前,要尽快完成巫妖王交给你的任务。
const int MAX_N = 505;
const int MAX_B = 100005;
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(dist, -1, sizeof(dist));
    queue<Point> q;
    // 读取a个感染源,初始化队列和距离数组
    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.push(Point(x, y));
        }
    }
    //!!! BFS扩散!!!
    while (!q.empty()) {
        Point p = q.front();
        q.pop();
        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] = dist[p.x][p.y] + 1;
                q.push(Point(nx, ny));
            }
        }
    }
    // 读取领主坐标并查询
    int* lords_x = new int[MAX_B];
    int* lords_y = new int[MAX_B];
    for (int i = 0; i < b; ++i) {
        scanf("%d %d", &lords_x[i], &lords_y[i]);
    }
    for (int i = 0; i < b; ++i) {
        printf("%d\n", dist[lords_x[i]][lords_y[i]]);
    }
    delete[] lords_x;
    delete[] lords_y;
    return 0;
}
内存和时间复杂度超过>=80%用户
这里空空如也




有帮助,赞一个