#include<cstdio>
using namespace std;
int n,m;
char inpu[1005][1005];
int map[1005][1005];
int vis[1005][1005];
int ans[100005];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int f[1005][1005];
int cnt,now;
void dfs(int x,int y)
{
vis[x][y]=1;
now++;
f[x][y]=cnt;
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=n&&map[x][y]!=map[nx][ny]&&!vis[nx][ny])
{
dfs(nx,ny);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",inpu[i]+1);
for(int j=1;j<=n;j++)
{
map[i][j]=inpu[i][j]-'0';
}
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(!vis[x][y])
{
cnt++;
now=0;
dfs(x,y);
ans[cnt]=now;
}
printf("%d\n",ans[f[x][y]]);
}
return 0;
}
由于询问次数m过大,每询问一次就搜索一次一定会超时。因此我们要预处理出联通快