思路:每搜到一个点就把和他相连的所有点标记成一样的,然后把个数存到D数组里,直接输出d数组里存的个数
#include<iostream>
#define o 1005
using namespace std;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int map[o][o],cnt=1;
char ch;
bool vis[o][o];
int paint[o][o],d[1000005];
int n,m,ans=0;
void solve(int i,int j)
{
if(i<0||j<0||i>=n||j>=n||paint[i][j])
return ;
ans++;
paint[i][j]=cnt;
for(int w=0;w<4;w++)
{
int nx=i+dx[w],ny=j+dy[w];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&map[nx][ny]!=map[i][j]&&!paint[nx][ny])
solve(nx,ny);
}
d[cnt]=ans;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>ch;
if(ch='1') map[i][j]=1;
else map[i][j]=0;
}
for(int i=0;i<m;i++)
{
ans=0;
int a,b;
cin>>a>>b;
if(!paint[a][b])
{
solve(a,b);
cnt++;
}
cout<<d[paint[a][b]]<<endl;
}
return 0;
}