用的BFS样例已对,交后听取WA声一片
#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,top;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int d=1e6;
struct gry{
int x,y;//坐标
}g[114514];//感染者
struct lz{
int x,y;
int tm;//时间
}l[114514];//领主
int t[1919810][4];
int vis[514][514];
void bfs(int a){
int i=0,j=a;//i为队头,j为队尾
while(i<j){
i++;
int x=t[i][1],y=t[i][2],z=t[i][3];
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&(vis[xx][yy]==-1||vis[xx][yy]>d)){
t[++j][1]=xx;
t[j][2]=yy;
t[j][3]=z+1;//染色时间
if(vis[xx][yy]>d){//如果是领主
l[vis[xx][yy]-d].tm=t[j][3];//领主被感染时间=该块染色时间
}
vis[xx][yy]=t[j][3];//避免重复入队
}
}
}
}
int main(){
cin>>n>>m>>a>>b;
memset(vis,-1,sizeof(vis));//初始化感染时间为-1(即开始假定全部都不会感染)
for(int i=1;i<=a;i++){
scanf("%d%d",&g[i].x,&g[i].y);
t[++top][1]=g[i].x;//入队,top确定输入结束后队列中已有多少名感染者
t[top][2]=g[i].y;
vis[g[i].x][g[i].y]=0;//初始化感染时间为零
}
for(int i=1;i<=b;i++){
scanf("%d%d",&l[i].x,&l[i].y);
vis[l[i].x][l[i].y]=i+d;//防止与时间重叠
}
bfs(top);
// for(int i=1;i<=n;i++){//为了测试染色是否正确
// for(int j=1;j<=m;j++){
// printf("%d ",vis[i][j]);
// }
// printf("\n");
// }
for(int i=1;i<=b;i++){
printf("%d\n",l[i].tm);
}
return 0;
}