记录编号 |
41633 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[福州培训2010] 01迷宫 |
最终得分 |
100 |
用户昵称 |
Makazeu |
是否通过 |
通过 |
代码语言 |
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;
}