首页 > 代码库 > 洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)

洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)

https://www.luogu.org/problem/show?pid=1141

题意:n*n地图,0可以走到相邻的某个1上,1可以走到相邻的某个0上,m次询问,问(x,y)能走到多少个格子?
n<=1e3,m<=1e5.若点a能到b,则b也能到a.显然a,b能到达的点相同,同一个联通块内的ans是相同的,即求点所在的连通块大小

#include <bits/stdc++.h>
using namespace std;
const int N=2e3+20;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int vis[N][N];
int n,mx,ans[N*N],cnt;//ans[i]第i块答案,连通块编号 
string s[N];
int dfs(int x,int y,int cur)
{
	vis[x][y]=cnt;
	mx++;
	int p=1-cur;
	for(int i=0;i<4;i++)
	{
		int a=x+dx[i];
		int b=y+dy[i];
		if(a>=0&&a<n&&b>=0&&b<n&&s[a][b]-‘0‘==p&&!vis[a][b])
			dfs(a,b,s[a][b]-‘0‘);
	}
} 
int main()
{
	int m;
	while(cin>>n>>m)
	{
		cnt=0;
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++)
			cin>>s[i];
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(!vis[i][j])
				{
					mx=0;
					cnt++;
					dfs(i,j,s[i][j]-‘0‘);
					ans[cnt]=mx;
				}
			}
		}
		while(m--)
		{
			int x,y;
			cin>>x>>y;
			x--,y--;
			cout<<ans[vis[x][y]]<<endl;
		}
	}
	return 0;
}

  

 

洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)