1 条题解

  • 0
    @ 2024-6-8 18:11:30

    多源bfs模板题。

    当有多个初始状态时,我们可以将它们全部加入队列中,然后正常进行处理即可。前提是把这几个初始状态放进同一个队列不会干扰有序性,否则就需要考虑开多个队列。

    还需要注意一个小坑:n mn\ ma ba\ b 的范围是不同的。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=505,M=1e5+5,d[4][2]={1,0,-1,0,0,1,0,-1}; 
    int n,m,a1,b1,ans[N][N];
    struct node{
    	int x,y;
    }a[M];
    queue<node> q;
    void bfs(){
    	memset(ans,0x3f,sizeof(ans));
    	for(int i=1;i<=a1;i++){
    		ans[a[i].x][a[i].y]=0;
    		q.push(a[i]);
    	}
    	while(!q.empty()){
    		int x=q.front().x,y=q.front().y;
    		q.pop();
    		for(int i=0;i<4;i++){
    			int xx=x+d[i][0],yy=y+d[i][1];
    			if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&ans[xx][yy]>ans[x][y]+1){
    				ans[xx][yy]=ans[x][y]+1;
    				q.push({xx,yy});
    			}
    		}
    	}
    }
    int main(){
    	scanf("%d%d%d%d",&n,&m,&a1,&b1);
    	for(int i=1;i<=a1;i++)
    		scanf("%d%d",&a[i].x,&a[i].y);
    	bfs();
    	for(int i=1,x,y;i<=b1;i++){
    		scanf("%d%d",&x,&y);
    		printf("%d\n",ans[x][y]);
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    773
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    89
    已通过
    52
    上传者