描述
有一个仅由数字 0 与 1 组成的 n×n 格迷宫。若你位于一格 0 上,那么你可以移动到相邻 4 格中的某一格 1 上,同样若你位于一格 1 上,那么你可以移动到相邻 4 格中的某一格 0 上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入描述
第一行为两个正整数 n,m。
下面 n 行,每行 n 个字符,字符只可能是 0 或者 1,字符之间没有空格。
接下来 m 行,每行两个用空格分隔的正整数 i,j,对应了迷宫中第 i 行第 j 列的一个格子,询问从这一格开始能移动到多少格。
输出描述
m 行,对于每个询问输出相应答案。
样例输入 1
2 2 01 10 1 1 2 2
样例输出 1
4 4
提示
【数据范围】
对于 100% 的数据,1≤n≤1000,1≤m≤100000。
#include<bits/stdc++.h>
using namespace std;
char mp[1005][1005];
int n,m,color=0;
bool vis[1006][1005];
int a[1000010];
int vir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool in(int x,int y){
return x>=0&&x<n&&y>=0&&y<n;
}
struct Node{
int x;
int y;
Node(int xx,int yy){
x=xx;
y=yy;
}
};
int bfs(int x,int y){
int sum=0;
queue<Node>s;
s.push(Node(x,y));
vis[x][y]=color;
while(!s.empty()){
for(int i=0;i<4;i++){
Node now=s.front();
int xx=now.x;
int yy=now.y;
int tx=now.x+vir[i][0];
int ty=now.y+vir[i][1];
if(tx==1&&ty==1){
}
if(mp[xx][yy]!=mp[tx][ty]&&!vis[tx][ty]&&in(tx,ty)){
s.push(Node(tx,ty));
vis[tx][ty]=color;
}
}
sum++;
s.pop();
}
return sum;
}
int main(){
memset(a,0,sizeof(a));
memset(mp,0,sizeof(mp));
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",mp[i]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!vis[i][j]){
color++;
a[color]=bfs(i,j);
}
}
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
cout<<a[vis[x][y]]<<endl;
}
return 0;
}