洛谷 P1332 血色先锋队 题解

题目链接

洛谷 P1332 血色先锋队

思路分析

一道广搜的题目。按照题意,首先将每个感染源作为起点,对全军跑一次广搜,对每个成员记录其感染的时间。然后只需依次输出每个领主的感染时间即可。

代码呈现

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;

const int N=505,K=1e5+10;
int n,m,a,b;
int ax[K],ay[K],bx[K],by[K],mp[N][N],dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1}; // dx,dy 方向数组

void bfs(){
    queue<pii> q;
    for (int i=1;i<=a;++i) mp[ax[i]][ay[i]]=0,q.push({ax[i],ay[i]}); // 入队+感染源感染时间为 0
    while (!q.empty()){
        pii u=q.front();q.pop();
        for (int i=1;i<=4;++i){
            int nx=u.first+dx[i],ny=u.second+dy[i];
            if (nx>=1 && nx<=n && ny>=1 && ny<=m && mp[nx][ny]==-1)
                mp[nx][ny]=mp[u.first][u.second]+1,q.push({nx,ny});
        }
    }
}
int main(){
    scanf("%d%d%d%d",&n,&m,&a,&b);
    for (int i=1;i<=a;++i) scanf("%d%d",ax+i,ay+i);
    for (int i=1;i<=b;++i) scanf("%d%d",bx+i,by+i);
    memset(mp,-1,sizeof mp); // 一开始 -1 表示没遍历到
    bfs();
    for (int i=1;i<=b;++i) printf("%d\n",mp[bx[i]][by[i]]);
    return 0;
}
posted @ 2026-01-25 20:00  CodingJuRuo  阅读(0)  评论(0)    收藏  举报