你正在玩一个迷宫游戏,迷宫有n×n格,每一格有一个数字0或1,可以从某一格移动到相邻四格中的一格上。为了消磨时间,你改变了玩法,只许从0走到1或者从1走到0。
现在给你一个起点,请你计算从这个格子出发最多能移动多少个格子(包含自身)。
输入格式:
第1行包含两个正整数n和m(1≤n≤1000,1≤m≤10000)。
接下来n行,对应迷宫中的n行,每行n个字符,字符为0或者1,字符之间没有空格。
接下来m行,表示m次询问。每行2个正整数i,j,表示从迷宫中第i行第j列的格子开始走。
输出格式:
输出共m行,每行一个整数,分别对应于输入数据中的m次询问,给出最多能移动的格子数。
输入样例:
2 2
01
10
1 1
2 2
输出样例:
4
4
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}Node;
int n,m;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int G[1002][1002];
bool vis[1002][1002]={false};
int step[1002][1002]={0};
bool test(node a,node b){
if(b.x>=1&&b.x<=n&&b.y>=1&&b.y<=n&&!vis[b.x][b.y]&&G[a.x][a.y]!=G[b.x][b.y]) return true;
return false;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
char c;cin>>c;
G[i][j]=c-'0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
stack<node>s;//经过的每一个点
queue<node>q;//bfs
int cnt=1;
Node.x=i;Node.y=j;
if(vis[i][j]==false){
vis[i][j]=true;
q.push(Node);
while(!q.empty()){
node now=q.front();
q.pop();
for(int k=0;k<4;k++){//四个方向
node next;
next.x=now.x+d[k][0];
next.y=now.y+d[k][1];
if(test(now,next)){
q.push(next);
vis[next.x][next.y]=true;
cnt++;
s.push(next);
}
}
}
step[i][j]=cnt;
while(!s.empty()){//堆栈用来存经过的每一个点,他们的步数都相同
node a=s.top();
step[a.x][a.y]=cnt;
s.pop();
}
}
}
}
while(m--){
int a,b;cin>>a>>b;
cout<<step[a][b]<<endl;
}
return 0;
}