给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。
网易的题目是真难理解啊
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
/*
BFS:用队列实现,类似于迷宫
输入:地牢矩阵maze,可移动的方向矩阵dx,dy,起始点到每个点的最近步数矩阵dist,访问矩阵visited,起点x0,y0
步骤:从起点出发按照方向遍历满足条件的其他点,并将满足的点入队,相应的改变步数矩阵与访问矩阵,继续从队顶取点遍历...一直到队列为空
*/
void BFS(vector<vector<char> >& maze,vector<int>& dx,vector<int>& dy,
vector<vector<int> >& dist,vector<vector<bool> >& visited,int x0,int y0,int n,int m)
{
//用队列存储x,y坐标
queue<int> xqueue;
queue<int> yqueue;
//1.起点入队
xqueue.push(x0);
yqueue.push(y0);
//2.循环,取出队列元素。。。。
int curDist=dist[x0][y0];
while(!xqueue.empty()&&!yqueue.empty())
{
int x=xqueue.front();
int y=yqueue.front();
xqueue.pop();
yqueue.pop();
visited[x][y]=true;
curDist=dist[x][y]+1;
//根据dx,dy中方向判断是否能走
for(int i=0;i<dx.size();i++)
{
int xnext=x+dx[i];
int ynext=y+dy[i];
//满足限制条件则入队,并且当前距离+1,访问标志置为true
if(xnext>=0&&xnext<n&&ynext>=0
&&ynext<m&&maze[xnext][ynext]=='.'
&&visited[xnext][ynext]==false)
{
xqueue.push(xnext);
yqueue.push(ynext);
dist[xnext][ynext]=curDist;
visited[xnext][ynext]=true;
}
}
/*
cout<<"---------dist矩阵-------------"<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<dist[i][j]<<" ";
}
cout<<endl;
}
*/
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
//保存地牢字符
vector<vector<char> > maze(n*m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
char ch;
cin>>ch;
maze[i].push_back(ch);
}
}
/*
cout<<"------maze矩阵------------"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<maze[i][j]<<" ";
}
cout<<endl;
}
*/
int x0,y0,k;
cin>>x0>>y0>>k;
//保存可选方向dx与dy
vector<int> dx(k);
vector<int> dy(k);
for(int i=0;i<k;i++)
{
int dxi,dyi;
cin>>dxi>>dyi;
dx.push_back(dxi);
dy.push_back(dyi);
}
/*
cout<<"-------dx dy------------"<<endl;
for(int i=0;i<k;i++)
{
cout<<dx[i]<<" "<<dy[i]<<endl;
}
*/
//构造起点到每个坐标的最近距离矩阵和访问矩阵
vector<vector<int> >dist(n,vector<int>(m,0));
vector<vector<bool> >visited(n,vector<bool>(m,false));
BFS(maze,dx,dy,dist,visited,x0,y0,n,m);
int maxDist=0;
bool notfind=false;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
/*
遍历每个可通行的'.'点,若其中有点未到达,则最坏情况是此点为出口,且到达不了出口,输出-1;
否则输出距离最大的点
*/
if(maze[i][j]=='.'&&visited[i][j]==false)
{
//notfind=true;
//break;
cout<<"-1"<<endl;
return 0;
}
if(maze[i][j]=='.'&&dist[i][j]>0&&maxDist<dist[i][j])
{
maxDist=dist[i][j];
}
}
}
//if(notfind)
//cout<<"-1"<<endl;
//else
cout<<maxDist<<endl;
return 0;
}
}
京公网安备 11010502036488号