萌 新求 助
查看原帖
萌 新求 助
91956
Dreamweaver楼主2021/5/4 19:47
#include<bits/stdc++.h>
using namespace std;
#define re register
#define Re register
#define maxm 100000
#define mod 100007
#define ll long long
int n,m;
char c[1010][1010]; 
int fa[1010];
int find(int u)
{
	if(fa[u]==u)	return u;
	return fa[u]=find(fa[u]);
}
int o(int&x,int& y)
{
	return x*n+y;
}
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
    return x*f;
}
int amo[1010];
int xx[10]={0,-1,0,1,0};
int yy[10]={0,0,1,0,-1};
signed main()
{
 	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	cin>>n>>m;
	for(re int i=1;i<=n*n;i++)	fa[i]=i,amo[i]=1;
//	getchar();
	for(Re int i=1;i<=n;i++)
	{
		for(re int j=1;j<=n;j++)
			cin>>c[i][j];
		//	c[i][j]=getchar();
	//	getchar();	
	}	
	for(re int i=1;i<=n;i++)
		for(re int j=1;j<=n;j++)
		{
			for(re int k=1;k<=4;k++)
			{
				int dx=i+xx[k];
				int dy=j+yy[k];
				if(dx<1||dy<1||dx>n||dy>n)	continue;
			//	int y=c[i][j]-'0';
			//	int u=c[dx][dy]-'0';
				if(c[i][j]!=c[dx][dy])
				{
				//	int p1=o(i,j);
				//	int p2=o(dx,dy);
					int	p1=find(o(i,j));
					int p2=find(o(dx,dy));
					if(p1!=p2)
						fa[p2]=p1,amo[p1]+=amo[p2];
				}
			}
		}
	for(re int i=1;i<=m;i++)
	{
		int a,b;
		a=read(),b=read();
		cout<<amo[find(o(a,b))]<<'\n';
	}
    return 0;
}

2021/5/4 19:47
加载中...