求助
查看原帖
求助
423270
l17663843890楼主2021/5/5 21:45
#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;

2021/5/5 21:45
加载中...