#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int n,m;
char map[1002][1002];
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
int f[1002][1002],ans[1002][1002];
struct o{
int x;
int y;
}d[999999];
void bfs(int x1,int y1)
{
int head=0;
int tail=1;
d[1].x=x1;
d[1].y=y1;
f[x1][y1]=1;
while(head<tail)
{
head++;
int xx=d[head].x;
int yy=d[head].y;
int k=map[xx][yy];
for(int i=1;i<=4;i++)
{
if(xx+dx[i]<=n&&xx+dx[i]>=1&&yy+dy[i]>=1&&yy+dy[i]<=n)
{
if(f[xx+dx[i]][yy+dy[i]]==0&&map[xx+dx[i]][yy+dy[i]]!=k)
{
f[xx+dx[i]][yy+dy[i]]=1;
d[++tail].x=xx+dx[i];
d[tail].y=yy+dy[i];
}
}
}
}
for(int i=1;i<=tail;i++)
ans[d[i].x][d[i].y]=tail;//记忆化!
}
int main()
{
int i,j;
char c1;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>c1,map[i][j]=c1-48;
/*for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%c",map[i][j]);
printf("\n");
}*/
for(i=1;i<=m;i++)
{
int x1,y1;
scanf("%d%d",&x1,&y1);
if(ans[x1][y1]==0) bfs(x1,y1);
printf("%d\n",ans[x1][y1]);
}
return 0;
}
不说了,这题坑点在记忆化,然后f数组也不用重置,用memset会超时的 QAQ。