http://www.luogu.org/problem/show?pid=1141
用bfs求连通分量,每个连通分量的答案都是一样的
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define ms(i,j) memset(i,j, sizeof i);
using namespace std;
const int dx[4] = {0,1,0,-1},
dy[4] = {1,0,-1,0};
struct node
{
int x;
int y;
node(int i, int j) : x(i), y(j){}
};
int n,m;
int za[1005][1005];
int map[1005][1005];
int step[1000005];
int index2 = 0;
int bfs(int x, int y, int in)
{
queue<node> q;
map[x][y] = in;
q.push(node(x,y));
while (!q.empty())
{
node p = q.front(); q.pop();
step[in]++;
for (int i=0;i<4;i++)
{
int tx = p.x + dx[i], ty = p.y + dy[i];
if (tx>0&&ty>0&&tx<=n&&ty<=n&&!map[tx][ty])
{
if (za[p.x][p.y]!=za[tx][ty])
{
map[tx][ty] = in;
q.push(node(tx, ty));
}
}
}
}
}
int main()
{
scanf("%d%d\n", &n, &m);
ms(za,0);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
char ch = getchar();
if (ch=='1') za[i][j] = 1;
}
scanf("\n");
}
ms(map,0); ms(step,0);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (!map[i][j])
bfs(i,j,++index2);
for (int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d", &a, &b);
printf("%d\n", step[map[a][b]]);
}
return 0;
}