题目描述
Rabbit在晚上回家的时候因为天太黑看不清路,陷入了一个迷宫里,她只能无助地留在原地等待救援。
由于Rabbit有很多粉丝,他们知道后立马展开了营救。
粉丝每一分钟可以上下左右移动一个位置,但是不能走出迷宫。
R
a
b
b
i
t
Rabbit
Rabbit想知道自己最快多久能被找到。
输入
输入数据第一行为T,表示数据组数。(1<=T<=100)
每组第一行为两个数n,m,表示迷宫的大小。(1<=n,m<=200)
接下来n行,每行m个字符。’.‘表示可以走的点,’#'表示不可以走的点,'R’表示Rabbit所在的位置,每个’F’表示Rabbit的粉丝的起始位置。
输出
对于每组数据,如果Rabbit能被安全找到,输出最小时间。
否则输出"Poor Rabbit."
样例输入
1
3 4
#.R#
F#…
…
样例输出
5
知识点
- 队列
- 广度优先搜索
注意情况
若无法营救则输出Poor Rabbit.注意有一个点(错了好多次😭)
代码片段
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int T,n,m,rx,ry,nx,ny,ax,ay,dis[1001][1001];
char maze[205][205],visit[205][205];
struct node{
int x,y;
};
queue<node> q;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int bfs(int rx,int ry)
{
q.push((node){rx,ry});
visit[rx][ry]=1;
while(!q.empty())
{
nx=q.front().x;
ny=q.front().y;
if(maze[nx][ny]=='F')
{
while(!q.empty()) q.pop();
return dis[nx][ny];
}
q.pop();
for(int i=0;i<4;i++)
{
ax=nx+dx[i];ay=ny+dy[i];
if(ax<0||ax>=n||ay<0||ay>=m) continue;
if(maze[ax][ay]=='#'||visit[ax][ay]==1) continue;
dis[ax][ay]=dis[nx][ny]+1;
visit[ax][ay]=1;
q.push((node){ax,ay});
}
}
return -1;
}
int main()
{
cin>>T;
while(T--)
{
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>maze[i][j];
if(maze[i][j]=='R')
{
rx=i;
ry=j;
}
}
}
int k=bfs(rx,ry);
if(k==-1) cout<<"Poor Rabbit."<<endl;
else cout<<k<<endl;
}
}