第二个点和第十个点WA了,但是不知道为啥,自我感觉这个搜索没毛病啊qwq.
基本思想就是bfs搜然后加上连通块
#include <cstdio>
#include <queue>
using namespace std;
int a[1001][1001],b[1001][1001],sum[1001];
int n,m,cnt,ans;
const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
queue<int> qx,qy;
inline void bfs(){
int X,Y,x,y;
while(!qx.empty()){
x=qx.front(),y=qy.front();qx.pop(),qy.pop();
for(int i=0;i<4;i++){
X=x+dx[i],Y=y+dy[i];
if(X>=1&&Y>=1&&X<=n&&Y<=n&&b[X][Y]==0&&(a[x][y]^a[X][Y]))
ans++,b[X][Y]=cnt,qx.push(X),qy.push(Y);
}
}
sum[cnt]=ans;
}
int main(){
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%1d",&a[i][j]);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if(b[x][y]!=0) printf("%d\n",sum[b[x][y]]);
else{
b[x][y]=++cnt,ans=1;
qx.push(x),qy.push(y);
bfs();
printf("%d\n",sum[cnt]);
}
}
return 0;
}