给定一个 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; } }