题目链接:https://www.luogu.org/problemnew/show/P1141
思路:每次给联通快标号,属于相同联通快的位置答案是一样的
c++代码:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=1005;
int g[maxn][maxn];
int flag[maxn][maxn];
int ans[maxn*maxn];
struct node {
int r,c;
node(int a,int b):r(a),c(b){}
node(){}
};
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
queue <node> q;
int main() {
int m,n;
scanf("%d %d",&n,&m);
memset(ans,0,sizeof(ans));
memset(flag,0,sizeof(flag));
//getchar();
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
char c;
cin >> c;//>>有忽略换行符的作用
g[i][j]=c-'0';
}
}
int cnt=1;
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(flag[i][j])continue;
q.push(node(i,j));
while(!q.empty()) {
node t=q.front();q.pop();
if(flag[t.r][t.c])continue;
flag[t.r][t.c]=cnt;
ans[cnt]++;
for(int k=0;k<4;k++) {
int x=t.r+dx[k],y=t.c+dy[k];
if(x<0||x>=n||y<0||y>=n||flag[x][y])continue;
//cout << x <<" "<<y <<endl;
//cout <<"?"<<g[t.r][t.c]<<" "<<g[x][y];
if(g[t.r][t.c]==g[x][y])continue;
q.push(node(x,y));
//cout <<"x="<<x <<" "<<y<<endl;
}
//cout <<"ans="<<ans[cnt]<<" "<<cnt <<endl;
}
cnt++;
}
}
for(int i=0;i<m;i++) {
int x,y;
//cout <<"?" <<endl;
scanf("%d%d",&x,&y);
printf("%d\n",ans[flag[x-1][y-1]]);
}
return 0;
}