题目链接
用一个map数组记录每一个人被感染的时间,最后遍历一遍领主数组输出即可。
import java.util.*;
import java.math.*;
public class Main {
public static int[] dx={1,-1,0,0},dy={0,0,-1,1};
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int a=sc.nextInt();
int b=sc.nextInt();
int[][] map=new int[n][m];
Queue<int[]> q=new LinkedList<int[]>();
for(int i=0;i<n;i++)
Arrays.fill(map[i],Integer.MAX_VALUE);
int[][] yuan=new int[a][2];
int[][] ling=new int[b][2];
for(int i=0;i<a;i++){
yuan[i][0]=sc.nextInt()-1;
yuan[i][1]=sc.nextInt()-1;
map[yuan[i][0]][yuan[i][1]]=0;
q.offer(new int[]{yuan[i][0],yuan[i][1]});
}
for(int i=0;i<b;i++){
ling[i][0]=sc.nextInt()-1;
ling[i][1]=sc.nextInt()-1;
}
while(!q.isEmpty()){
int[] cur=q.poll();
int x=cur[0];
int y=cur[1];
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<0||yy<0||xx==n||yy==m||map[xx][yy]!=Integer.MAX_VALUE)
continue;
map[xx][yy]=map[x][y]+1;
q.offer(new int[]{xx,yy});
}
}
for(int i=0;i<b;i++){
System.out.println(map[ling[i][0]][ling[i][1]]);
}
}
}