P1141
#include <bits/stdc++.h>
using namespace std;
int m[11451][41919];
queue<int> xx;
queue<int> yy;
int ste[1145][1419];
int bo[1145][1419];
int inx,iny;
int in[1145141][9];
int w,b;
int n;
int bfs(int x,int y){
int flag=1;
//flag是因为实在想不到别的好的变量名去存可以到的地点的个数,后来发现flag貌似和sum一样
int nx,ny;
int move[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int sum=1;
in[flag][1]=x;
in[flag][2]=y;
bo[x][y]=1;
xx.push(x);
yy.push(y);
//这里一定要记得标记起点和将起点的坐标放进队列,这里也看了好久才发现。
while(xx.empty() && yy.empty())
{
xx.pop();
yy.pop();
for(int t=0;t<4;t++)
{
nx=x+move[t][0];
ny=y+move[t][1];
w=m[x][y];
b=m[nx][ny];
if(bo[nx][ny]==0 && w!=b && nx>0 && ny>0 && nx<=n && ny<=n)
{
flag++;
in[flag][1]=nx;
in[flag][2]=ny;
bo[nx][ny]=1;
xx.push(nx);
yy.push(ny);
sum++;
}
}
x=xx.front();
y=yy.front();
}
for(int i=1;i<=flag;i++)
{
ste[in[i][1]][in[i][2]]=sum;
}
return sum;
}
int main() {
int m1;
cin>>n>>m1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m1; ++j) {
cin>>m[i][j];
}
}
for (int i = 1; i <= m1; ++i) {
cin >> inx >> iny;
if (bo[inx][iny] == 0) {
bfs(inx, iny);
printf("%d\n", ste[inx][iny]);
} else {
printf("%d\n", ste[inx][iny]);
}
}
return 0;
}
没输出