题目描述
给出一个 行 列的矩阵,每个单元是一个血色先锋军的成员。感染瘟疫的人,每过一小时,就会向四周扩散瘟疫,直到所有人全部感染上瘟疫。你已经掌握了感染源的位置,任务是算出血色先锋军的领主们感染瘟疫的时间
题目解析
瘟疫是以时间为阶段逐步扩张的,题目要求某个领主最早的感染时间,所以可以想到宽搜
首先,将所有感染源加入队列。然后,进入宽搜过程,将所有的格子搜索完毕,得到的即为每个格子得最早感染时间。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,A,B,u,v;
int a[505][505],fx[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
bool flag[505][505];
queue<int> q;
void fun()
{
while(!q.empty())
{
u=q.front(),q.pop();
v=q.front(),q.pop();
flag[u][v]=0;
int x,y;
for(int i=0;i<4;i++)
{
x=u+fx[i][0],y=v+fx[i][1];
if(x<1||x>n||y<1||y>m) continue;
if(a[x][y]>a[u][v]+1)
{
a[x][y]=a[u][v]+1;
if(!flag[x][y])
{
flag[x][y]=1;
q.push(x);q.push(y);
}
}
}
}
}
int main()
{
memset(a,0x3f,sizeof(a));
scanf("%d%d%d%d",&n,&m,&A,&B);
for(int i=1;i<=A;i++)
{
scanf("%d%d",&u,&v);
a[u][v]=0;
flag[u][v]=1;
q.push(u);q.push(v);
}
fun();
for(int i=1;i<=B;i++)
{
scanf("%d%d",&u,&v);
printf("%d\n",a[u][v]);
}
}