求助,BFS加记搜
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,e=0,i,j,k,l,aa[1005][1005]={0},ba[1005][1005]={0};
char bb[1005][1005];
bool ab[1005][1005];
void bfs(int f,int g){
e+=1;
ab[f][g]=false;
if(f!=1&&ab[f-1][g]&&aa[f-1][g]==aa[f][g]){
bfs(f-1,g);
}
if(g!=1&&ab[f][g-1]&&aa[f][g-1]==aa[f][g]){
bfs(f,g-1);
}
if(g!=a&&ab[f][g+1]&&aa[f][g+1]==aa[f][g]){
bfs(f,g+1);
}
if(f!=a&&ab[f+1][g]&&aa[f+1][g]==aa[f][g]){
bfs(f+1,g);
}
return ;
}
int main(){
scanf("%d %d",&a,&b);
for(i=1;i<=a;i++){
for(j=1;j<=a;j++){
aa[i][j]=0;
ab[i][j]=true;
}
}
for(i=1;i<=a;i++){
scanf("%s",bb[i]);
}
for(i=1;i<=a;i++){
for(j=1;j<=a;j++){
aa[i][j]=bb[i][j-1]-'0';
if((i+j)%2==0){
aa[i][j]=1-aa[i][j];#二染色
}
}
}
for(i=1;i<=b;i++){
scanf("%d %d",&c,&d);
if(ba[c][d]==0){
bfs(c,d);
printf("%d\n",e);
for(k=1;k<=a;k++){
for(j=1;j<=a;j++){
if(!ab[i][j]){
ba[k][j]=e;
}
}
}
e=0;
for(k=1;k<=a;k++){
for(j=1;j<=a;j++){
ab[k][j]=true;
}
}
}
else{
printf("%d\n",ba[c][d]);
}
}
}
```c