1048645526wangyuxin @ 2024-11-26 21:18:03
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct shudui{long x,y;};
char a[1001][1001];
long b[1001][1001];//b存数值
int n,m;
bool f[1001][1001];
queue<int> qx,qy;
shudui fu[1001][1001];
shudui find(int x,int y);
void hebing(int x1,int y1,int x2,int y2);
void bfs(int x,int y);
signed main(){
// freopen("sb.in","r",stdin);
// freopen("sb.out","w",stdout);
cin>>n>>m;
char ch;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>ch;
a[i][j]=ch;
}
}
// for(int i=1;i<=n;i++){
// cout<<a[i]<<endl;
// }
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
fu[i][j].x=i;
fu[i][j].y=j;
}
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
if(fu[x][y].x==x&&fu[x][y].y==y){
bfs(x,y);
printf("%ld\n",b[x][y]);
}else{
shudui ch;
ch=find(x,y);
printf("%ld\n",b[ch.x][ch.y]);
}
}
return 0;
}
shudui find(int x,int y){
shudui ch;
if(fu[x][y].x==x&&fu[x][y].y==y){
ch.x=x;ch.y=y;
return ch;
}else{
ch=find(fu[x][y].x,fu[x][y].y);
fu[x][y].x=ch.x;
fu[x][y].y=ch.y;
return ch;
}
}
void hebing(int x1,int y1,int x2,int y2){
shudui ch1,ch2;
ch1=find(x1,y1);
ch2=find(x2,y2);
fu[ch2.x][ch2.y].x=fu[ch1.x][ch1.y].x;
fu[ch2.x][ch2.y].y=fu[ch1.x][ch1.y].y;
return ;
}
void bfs(int x,int y){
int tx[5]={0,1,0,-1,0};
int ty[5]={0,0,1,0,-1};
qx.push(x);
qy.push(y);
while(qx.size()!=0){
char ch;int xx=qx.front(),yy=qy.front();
if(a[xx][yy]=='0'){
ch='1';
}else{
if(a[xx][yy]=='1'){
ch='0';
}//else ch=0;
}
b[x][y]++;
a[xx][yy]='2';
f[xx][yy]=1;
// cout<<xx<<' '<<yy<<endl;
// cout<<ch<<endl;
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// cout<<a[i][j];
// }cout<<endl;
// }cout<<endl;
for(int i=1;i<=4;i++){
if(a[xx+tx[i]][yy+ty[i]]==ch&&xx+tx[i]>0&&xx+tx[i]<=n&&yy+ty[i]>0&&yy+ty[i]<=n&&f[xx+tx[i]][yy+ty[i]]==0){
// cout<<xx+tx[i]<<' '<<yy+ty[i]<<endl;
f[xx+tx[i]][yy+ty[i]]=1;
qx.push(xx+tx[i]);
qy.push(yy+ty[i]);
hebing(x,y,xx+tx[i],yy+ty[i]);
}
}
qx.pop();
qy.pop();
}
return ;
}