#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int mat[510][510]={0};//时间数组
int flag[510][510]={0};//访问数组
struct node{//节点结构体
int x,y;
};
queue<node> q;//bfs队列
int main()
{
int n,m;
int a,b;
int x,y;
node temp;
cin>>n>>m>>a>>b;
for(int i=0;i<a;i++)//读入感染源
{
cin>>temp.x>>temp.y;
q.push(temp);
mat[temp.x][temp.y]=0;
flag[temp.x][temp.y]=1;
}
while(!q.empty())//bfs
{
temp=q.front();
x=temp.x;
y=temp.y;
q.pop();
if(temp.x<1||temp.x>n||temp.y<1||temp.y>m)//剪枝
{
continue;
}
temp.x=x+1;temp.y=y;//将上下左右四个点中未访问的加入队列
if(!flag[temp.x][temp.y])
{
q.push(temp);
mat[temp.x][temp.y]=mat[x][y]+1;
flag[temp.x][temp.y]=1;
}
temp.x=x;temp.y=y+1;
if(!flag[temp.x][temp.y])
{
q.push(temp);
mat[temp.x][temp.y]=mat[x][y]+1;
flag[temp.x][temp.y]=1;
}
temp.x=x-1;temp.y=y;
if(!flag[temp.x][temp.y])
{
q.push(temp);
mat[temp.x][temp.y]=mat[x][y]+1;
flag[temp.x][temp.y]=1;
}
temp.x=x;temp.y=y-1;
if(!flag[temp.x][temp.y])
{
q.push(temp);
mat[temp.x][temp.y]=mat[x][y]+1;
flag[temp.x][temp.y]=1;
}
}
for(int i=0;i<b;i++)//查找
{
cin>>x>>y;
cout<<mat[x][y]<<endl;
}
return 0;
}
洛谷p1332血色先锋队 普及/提高- 模拟,bfs,剪枝
最新推荐文章于 2023-03-18 17:21:43 发布