[4.27] T1-血色先锋军

题目描述

给出一个 N N M M 列的矩阵,每个单元是一个血色先锋军的成员。感染瘟疫的人,每过一小时,就会向四周扩散瘟疫,直到所有人全部感染上瘟疫。你已经掌握了感染源的位置,任务是算出血色先锋军的领主们感染瘟疫的时间

题目解析

瘟疫是以时间为阶段逐步扩张的,题目要求某个领主最早的感染时间,所以可以想到宽搜

首先,将所有感染源加入队列。然后,进入宽搜过程,将所有的格子搜索完毕,得到的即为每个格子得最早感染时间。

代码

#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]);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43909855/article/details/89601090