80分BFS求助
查看原帖
80分BFS求助
638371
152chenzihao楼主2023/3/19 20:01
#include<bits/stdc++.h>
using namespace std;

int n,m,a[1005][1005],x,y,mx;
int lt[1005][1005];
bool pdd[1005][1005];
int xx[5]={0,0,0,-1,1};
int yy[5]={0,1,-1,0,0};
int pd[1005][1005];//判断是否走过
queue<int> qx,qy; 

void bfs(){
	while(!qx.empty()){
		int x0=qx.front();
		int y0=qy.front();
		qx.pop();
		qy.pop();
		for(int i=1;i<=4;i++){
			int nx=x0+xx[i];
			int ny=y0+yy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&a[x0][y0]!=a[nx][ny]&&pd[nx][ny]==0){
//				cout<<nx<<" "<<ny<<endl;
				pd[nx][ny]=1;
				pdd[nx][ny]=true;
				mx++;
				qx.push(nx);
				qy.push(ny);
			}
		}
	}
	cout<<mx<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(pdd[i][j]) lt[i][j]=mx;
		}
	}
}

int main(){
//	freopen("P1141_3.in","r",stdin);
//	freopen("P1141.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			scanf("%1d",&a[i][j]);
			lt[i][j]=-1;
		}
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		if(lt[x][y]>=0){
			cout<<lt[x][y]<<endl;
			continue;
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				pd[i][j]=0;
				pdd[i][j]=false;
			}
		}
		mx=1;
		pd[x][y]=1;
		qx.push(x);
		qy.push(y);
		bfs();
	}
	return 0;
}
2023/3/19 20:01
加载中...