dalao救我!
查看原帖
dalao救我!
1127560
SR_G_B_ysqd1602楼主2024/7/30 16:03

用的BFS样例已对,交后听取WA声一片

评测结果

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,top;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int d=1e6;
struct gry{
	int x,y;//坐标 
}g[114514];//感染者 
struct lz{
	int x,y;
	int tm;//时间 
}l[114514];//领主
int t[1919810][4];
int vis[514][514];
void bfs(int a){
	int i=0,j=a;//i为队头,j为队尾 
	while(i<j){
		i++;
		int x=t[i][1],y=t[i][2],z=t[i][3];
		for(int i=0;i<4;i++){
			int xx=x+dx[i];
			int yy=y+dy[i];
			if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&(vis[xx][yy]==-1||vis[xx][yy]>d)){
				t[++j][1]=xx;
				t[j][2]=yy;
				t[j][3]=z+1;//染色时间 
				if(vis[xx][yy]>d){//如果是领主 
					l[vis[xx][yy]-d].tm=t[j][3];//领主被感染时间=该块染色时间 
				}
				vis[xx][yy]=t[j][3];//避免重复入队 
			}
		}
	}
}
int main(){
	cin>>n>>m>>a>>b;
	memset(vis,-1,sizeof(vis));//初始化感染时间为-1(即开始假定全部都不会感染) 
	for(int i=1;i<=a;i++){
		scanf("%d%d",&g[i].x,&g[i].y);
		t[++top][1]=g[i].x;//入队,top确定输入结束后队列中已有多少名感染者 
		t[top][2]=g[i].y;
		vis[g[i].x][g[i].y]=0;//初始化感染时间为零 
	}
	for(int i=1;i<=b;i++){
		scanf("%d%d",&l[i].x,&l[i].y);
		vis[l[i].x][l[i].y]=i+d;//防止与时间重叠 
	}
	bfs(top);
//	for(int i=1;i<=n;i++){//为了测试染色是否正确 
//		for(int j=1;j<=m;j++){
//			printf("%d ",vis[i][j]);
//		}
//		printf("\n");
//	} 
	for(int i=1;i<=b;i++){
		printf("%d\n",l[i].tm);
	}
	return 0;
}
2024/7/30 16:03
加载中...