题目描述
有一个仅由数字00与11组成的n \times nn×n格迷宫。若你位于一格00上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格11上,那么你可以移动到相邻44格中的某一格00上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入格式
第11行为两个正整数n,mn,m。
下面nn行,每行nn个字符,字符只可能是00或者11,字符之间没有空格。
接下来mm行,每行22个用空格分隔的正整数i,ji,j,对应了迷宫中第ii行第jj列的一个格子,询问从这一格开始能移动到多少格。
输出格式
mm行,对于每个询问输出相应答案。
输入
2 2
01
10
1 1
2 2
输出
4
思路
把初始0和1 赋值为 -1和 1,每次当两个数*=-1时,才入队
# include<iostream>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
using namespace std;
typedef long long ll;
const int mod=1000;
const int MAX=150005;
const int Time=86400;
struct node{
int x;
int y;
int states;
};
string s;
int n,m,x,y,maxn,ans;
int a[1005][1005];
int mAX[MAX];
int res[1005][1005];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
ll bfs(int x,int y,int states){
queue<node>q;
q.push({x,y,states});
res[x][y]=ans;
int cnt=1;
while(q.size()){
node now=q.front() ;
q.pop();
for(int i=0;i<4;i++){
int xx = now.x + dx[i];
int yy = now.y + dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&now.states*a[xx][yy]==-1&&!res[xx][yy])
q.push({xx,yy,a[xx][yy]}),res[xx][yy]=ans,cnt++;
}
}
mAX[ans]=cnt;
return cnt;
}
int main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s;
for(int j=1;j<=s.size();j++){
if(s[j-1]=='0') a[i][j]=-1;
else a[i][j]=1;
}
}
while(m--){
cin>>x>>y;
if(res[x][y]){
cout<<mAX[res[x][y]]<<"\n";
}
else{
ans++;
cout<<bfs(x,y,a[x][y])<<"\n";
}
}
return 0;
}