超时3个点,大佬求助,这题怎么应用连通块的思想呀?
  • 板块P1141 01迷宫
  • 楼主Rhss
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/9 05:20
  • 上次更新2023/10/27 16:21:30
查看原帖
超时3个点,大佬求助,这题怎么应用连通块的思想呀?
684890
Rhss楼主2022/8/9 05:20
#include <bits/stdc++.h>
#define nx 1100
using namespace std;
typedef pair<int,int> p1;
char a[nx][nx];
int n,m;
int ans;
bool vis[nx][nx];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void bfs(int x,int y){
	queue<pair<int,int> > p;
	p.push({x,y});
	vis[x][y]=true;
	while(!p.empty()){
		ans++;
		p1 r = p.front();
		p.pop();
		for(int i = 0;i<4;++i){
			int rx = r.first+dx[i];
			int ry = r.second+dy[i];
			//坐标合法
			if(rx>=1&&rx<=n&&ry>=1&&ry<=n){
				//01对应
				if(a[r.first][r.second]=='1'){
					if(a[rx][ry]=='0'&&vis[rx][ry]==false){
						p.push({rx,ry});
						vis[rx][ry]=true;
					}
				}else{
					if(a[rx][ry]=='1'&&vis[rx][ry]==false){
						p.push({rx,ry});
						vis[rx][ry]=true;						
					}
				}
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i = 1;i<=n;++i){
		for(int j = 1;j<=n;++j){
			cin>>a[i][j];
		}
	}
	int x,y;
	for(int i = 0;i<m;++i){
		cin>>x>>y;
		ans=0;
		fill(vis[0],vis[0]+nx*nx,false);
		bfs(x,y);
		cout<<ans<<endl;
	}
	return 0;
}

2022/8/9 05:20
加载中...