记录编号 41633 评测结果 AAAAAAAAAA
题目名称 [福州培训2010] 01迷宫 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.429 s
提交时间 2012-08-05 23:52:29 内存使用 8.09 MiB
显示代码纯文本
/*
* Problem : maze01
* Contest : FJSummer-Day2
* Author  : Yeefan Zhu 
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN=1010;
int N,M,map[MAXN][MAXN];
int ans[MAXN][MAXN]; 
class Point{public:int x,y;};
queue <Point> ps,q;
int res,qx,qy;
const int step[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

inline void bfs(int si,int sj)
{
	q.push((Point){si,sj});
	int nx,ny; Point tmp;
	ans[si][sj]=1; res=1;
	while(q.size())
	{
		tmp=q.front(); q.pop();
		for(int i=0;i<4;i++)
		{
			nx=tmp.x+step[i][0];
			ny=tmp.y+step[i][1];
			if(nx<1 || nx>N || ny<1 || ny>N) continue;
			if(map[tmp.x][tmp.y]+map[nx][ny]!=1) continue;
			if(ans[nx][ny]) continue;
			res++; q.push((Point){nx,ny});
			ps.push((Point){nx,ny});
			ans[nx][ny]=1;
		}
	}
	while(ps.size())
	{
		tmp=ps.front(); ps.pop();
		ans[tmp.x][tmp.y]=res;
	}
}

int main()
{
	freopen("maze01.in","r",stdin);
	freopen("maze01.out","w",stdout);
	scanf("%d %d\n",&N,&M);char c;
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=N;j++)
		{
			c=0;  while(c!='0' && c!='1') 
			scanf("%c",&c); map[i][j]=c-'0';
		}
	}
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=N;j++)
		{
			if(ans[i][j]) continue;
			ps.push((Point){i,j});
			bfs(i,j);
		}
	}
	for(int i=1;i<=M;i++)
	{
		scanf("%d%d\n",&qx,&qy);
		printf("%d\n",ans[qx][qy]);
	}
	return 0;
}