先求每个连通块的大小,查询每个点时就直接输出这个点所在连通块的大小。别的9个点都过了但是2卡了(悲)QAQ求各位大佬帮忙看看罢。
#include<iostream>
using namespace std;
const int N=1050,M=100100;
int n,q;
bool a[N][N],vis[N][N];
int id[N][N],cnt[M],idx=0,sum;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void dfs(int x,int y)
{
int tx,ty;
for(int i=0;i<4;i++)
{
tx=x+dx[i],ty=y+dy[i];
if(vis[tx][ty]||!(a[x][y]^a[tx][ty])||tx<1||tx>n||ty<1||ty>n)continue;
sum++,vis[tx][ty]=true,id[tx][ty]=idx,dfs(tx,ty);
}
cnt[idx]=sum;
}
int main()
{
char c;
cin>>n>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>c,a[i][j]=c-'0';
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!vis[i][j])id[i][j]=idx,vis[i][j]=true,sum=1,dfs(i,j),idx++;
int t,tt;
while(q--)scanf("%d%d",&t,&tt),printf("%d\n",cnt[id[t][tt]]);
return 0;
}