#include <bits/stdc++.h>
using namespace std;
int n,m,a,b,vis[550][550],mp[550][550];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int gx[550],gy[550],bx[550],by[550];
struct node
{
int x,y,s;
};
void bfs(int x,int y)
{ queue<node> q;
vis[x][y]=1;
node a={x,y,0};
q.push(a);
while(!q.empty())
{
node k=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int fx=k.x+dx[i];
int fy=k.y+dy[i];
if(!vis[fx][fy]&&fx>=1&&fx<=n&&fy>=1&&fy<=m)
{
vis[fx][fy]=1;
mp[fx][fy]=min(mp[fx][fy],k.s+1);
node p={fx,fy,k.s+1};
q.push(p);
}
}
}
}
main()
{
cin>>n>>m>>a>>b;
for(int i=1;i<=n;i++) //初始化地图
for(int j=1;j<=m;j++)
mp[i][j]=9999;
for(int i=1;i<=a;i++) //感染坐标
{
cin>>gx[i]>>gy[i];
}
for(int i=1;i<=b;i++) //领主坐标
{
cin>>bx[i]>>by[i];
}
for(int i=1;i<=a;i++) //枚举每一个感染源感染地图里每一个点的最短距离
{
memset(vis,0,sizeof(0));
int x=gx[i];
int y=gy[i];
bfs(x,y);
}
for(int i=1;i<=b;i++) //输出
{
cout<<mp[bx[i]][by[i]]<<endl;
}
}
调试了很长时间不过 ,首先我还没有特判感染源和领主重合的情况 。因为出了一个毛病,如下。
我发现我bfs里面的 mp[fx][fy]=min(mp[fx][fy],k.s+1);,这个min似乎只会更新一次,就是只有第一个感染源进行搜索的时候才会更新,之后就一直不变
按照样例的话,有两个感染源,然后我把我的程序 for(int i=1;i<=a;i++)
{
memset(vis,0,sizeof(0));
int x=gx[i];
int y=gy[i];
bfs(x,y);
}
改成 i=2,才会输出3 1 3;