题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻44格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入输出格式
输入格式:
第1行为两个正整数n,mn,m。
下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。
输出格式:
m行,对于每个询问输出相应答案。
输入输出样例
输入样例#1:
2 2
01
10
1 1
2 2
输出样例#1:
4
4
AC代码
#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
#define MAX 1005
using namespace std;
typedef struct
{
int x;
int y;
} Ele;
int n,m;
int sum;
string graph[MAX];
int flag[MAX][MAX];
//记录连通分量(用于优化)
Ele step[1000001];
int save[MAX][MAX];
int dirx[4] = {1,-1,0,0};
int diry[4] = {0,0,1,-1};
int bfs(int x,int y);
int main()
{
int x,y;
cin>>n>>m;
for(int i = 0 ; i<n ; i++)
cin>>graph[i];
for(int i = 0 ; i<m ; i++)
{
sum = 1;
cin>>x>>y;
x--;
y--;
if(save[x][y]==0)
cout<<bfs(x,y)<<endl;
else
cout<<save[x][y]<<endl;
}
return 0;
}
int bfs(int x,int y)
{
queue<Ele> q;
int t = 0;
Ele node,temp,next;
node.x = x;
node.y = y;
//将起点入队
q.push(node);
step[t].x = x;
step[t].y = y;
flag[x][y] = 1;
//当队列不为空时
while(!q.empty())
{
//取出队头
temp = q.front();
//队头出队
q.pop();
//遍历出度
for(int i = 0 ; i<4 ; i++)
{
next.x = temp.x+dirx[i];
next.y = temp.y+diry[i];
//条件控制
if(next.x<0||next.x>=n)
continue;
if(next.y<0||next.y>=n)
continue;
if(flag[next.x][next.y]==0
&&abs(graph[next.x][next.y]-graph[temp.x][temp.y])==1)
{
t++;
step[t].x = next.x;
step[t].y = next.y;
sum++;
flag[next.x][next.y] = 1;
//满足条件入队
q.push(next);
}
}
}
for(int i = 0 ; i<=t ; i++)
save[step[i].x][step[i].y] = sum;
return sum;
}
模板
void bfs(int x...)
{
queue<T> q;
//起点入队
q.push(x);
//标记访问
flag[x] = 1;
//队列不为空时循环
while(!q.empty())
{
//获取队头
int t = q.front();
//队头出队
q.pop();
//遍历所有出度
for()
{
//条件控制
if(flag[]==0&&)
{
//标记访问
flag[] = 1;
//满足条件入队
q.push(t+k);
}
}
}
}