样例能过30pts求助(玄关)
查看原帖
样例能过30pts求助(玄关)
1199534
ycy1124楼主2024/5/7 19:19

bfs

#include<bits/stdc++.h>
using namespace std;
char a[200][200];
int ans[200][200];
bool vis[200][200];
queue<int> x,y;
int p1[4]={0,0,1,-1},p2[4]={1,-1,0,0};
int m,n;
void bfs(int x1,int y1,int x2,int y2){
	//printf("%d %d %d %d\n",x1,y1,x2,y2);
	if(a[x1][y1]!='1')
		if(ans[x1][y1]==-1)
			ans[x1][y1]=abs(x1-x2)+abs(y1-y2);
		else
			ans[x1][y1]=min(ans[x1][y1],abs(x1-x2)+abs(y1-y2));
	for(int i=0;i<=3;i++){
		if(!vis[x1+p1[i]][y1+p2[i]]&&x1+p1[i]>=1&&x1+p1[i]<=n&&y1+p2[i]>=1&&y1+p2[i]<=m){
			vis[x1+p1[i]][y1+p2[i]]=1;
			x.push(x1+p1[i]);
			y.push(y1+p2[i]);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			ans[i][j]=-1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='1'){
			for(int k1=1;k1<=n;k1++){
				for(int k2=1;k2<=m;k2++){
					vis[k1][k2]=0;
				}
			}
				x.push(i);
				y.push(j);
				while(!x.empty()){
					bfs(x.front(),y.front(),i,j);
					x.pop();
					y.pop();
				}
			}
		} 
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='1')
				printf("0 ");
			else
				printf("%d ",ans[i][j]);
		}
		printf("\n");
	}
	return 0;
}
2024/5/7 19:19
加载中...