题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入
第1行为两个正整数n,m。 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。
输出
m行,对于每个询问输出相应答案。
样例输入
2 2
01
10
1 1
2 2
样例输出
4
4
提示
n <= 400
分析
使用BFS,需要判断当前位置是0还是1,再根据这一点来对下一个点进行探索
#include <bits/stdc++.h>
using namespace std;
int main()
{
int dx[4] = {-1,0,1,0};//横向移动
int dy[4] = {0,-1,0,1};//纵向移动
int n,m,ans;
cin>>n>>m;
vector<vector<char>> dis;//定义地图
for(int i = 0;i<n;i++){
vector<char> tmp;
for(int j = 0;j<n;j++){
char tp;
cin>>tp;
tmp.push_back(tp);
}
dis.push_back(tmp);
}
bool visited[n][n];
queue<pair<int,int>> que;
for(int i = 0;i<m;i++){
memset(visited,false,sizeof(visited));
int x,y;
cin>>x>>y;
ans = 1;
que.push(make_pair(x-1,y-1));
visited[x-1][y-1] = true;
while(!que.empty()){
int xx = que.front().first,yy = que.front().second;
que.pop();
char flag = dis[xx][yy];//引入flag,记录当前位置是0还是1
for(int j = 0;j<4;j++){
if(xx+dx[j]>=0&&
xx+dx[j]<n&&
yy+dy[j]>=0&&
yy+dy[j]<n&&
dis[xx+dx[j]][yy+dy[j]] != flag&&
visited[xx+dx[j]][yy+dy[j]] == false){
ans++;
visited[xx+dx[j]][yy+dy[j]] = true;
que.push(make_pair(xx+dx[j],yy+dy[j]));
}
}
}
cout<<ans<<endl;
}
return 0;
}