#include <bits/stdc++.h>
using namespace std;
bool f[2005][2005];//初始读入数组
long long cur = 0;//a数组光标
long long a[200005];//记录每种cnt的数值
long long cnt = 0;//记录走到格子数
long long z[2005][2005];//记录种类(后面方便与a数组输出)
long long n, m;//...
bool f3 = false;//记录上次格子01
bool f4 = false;//记录是否为第一次执行dfs
void dfs(long long x, long long y)//x行y列的参数
{
if(z[x][y] != 0)
{
return;
}
if(x == 0 || y == 0)//判越界
{
return;
}
if(x > n || y > n)//判越界
{
return;
}
bool f2 = f[x][y];//记录当前格子01
if(f2 == f3 && !f4)//若01相同
{
return;//打回
}
//否则继续运行
f3 = f2;//维护上次格子01
z[x][y] = cur;//维护种类
cnt++;//维护计数器
/*000
010
000*/
x--;
/*010
000
000*/
dfs(x, y);//下一步
y--;
/*100
000
000*/
dfs(x, y);
y++;
/*010
000
000*/
y++;
/*001
000
000*/
dfs(x, y);
y--;
/*010
000
000*/
x++;
/*000
010
000*/
y--;
/*000
100
000*/
dfs(x, y);
y++;
/*000
010
000*/
y++;
/*000
001
000*/
dfs(x, y);
y--;
/*000
010
000*/
x++;
/*000
000
010*/
dfs(x, y);
y--;
/*000
000
100*/
dfs(x, y);
y++;
/*000
000
010*/
y++;
/*000
000
001*/
dfs(x, y);
}
int main()
{
cin >> n >> m;
for(long long i = 1; i <= n; i++)
{
string s;
cin >> s;
for(long long j = 0; j < s.size(); j++)
{
f[i][j + 1] = s[j] - '0';
}
}
/*输入*/
for(long long i = 1; i <= n; i++)
{
for(long long j = 1; j <= n; j++)
{
if(z[i][j] == 0)
{
f4 = true;
cur++;//维护种类
cnt = 0;//计数器清零
dfs(i, j);//开始
a[cur] = cnt;//维护a数组
}
}
}
while(m--)
{
long long x, y;
cin >> x >> y;
cout << a[z[x][y]] << endl;
}
}
第2个大评测点过了,但第一个全wa