A - Maze
-
题目要求:东东有一张地图,想通过地图找到妹纸。地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。
-
解题思路:主要利用bfs,从起点(0,0)开始,在不会越界的前提下分别向四个方向移动,用pair类型的二维数组记录上一个点的位置,用bool类型的二维数组对经过的点进行标记,每次将未被标记的点存入队列,标记过的点不再存入队列。从队首元素的位置再次向四个方向移动,直到到达终点或是队列为空时跳出循环。bfs得出的是最短路线,从终点开始回溯路径,二维数组中存着上一个点的位置,将路径记录在数组中,回溯到(0,0)为止。因为是回溯路径所以需要将数组倒序输出,得出最短路线。
-
代码实现:
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
bool vis[5][5];
int a[5][5];
pair <int,int> path[5][5];
int sx=0,sy=0;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
queue<pair<int,int> > Q;
int bfs()
{
memset(vis,0,sizeof(vis));
memset(path,0,sizeof(path));
Q.push({sx, sy});
vis[sx][sy]=1;
while(!Q.empty())
{
pair<int, int> u=Q.front();
if(u.first==4&&u.second==4){
break;
}
for(int i=0;i<4;++i)
{
int x=u.first+dx[i],y=u.second+dy[i];
int xx=u.first,yy=u.second;
if (x>=0&&x<=4&&y>=0&&y<=4&&!vis[x][y]&&!a[x][y])
{
path[x][y]={xx,yy};
vis[x][y]=1;
Q.push({x, y});
}
}
Q.pop();
}
vector<int> aa;
vector<int> bb;
/* for(int i=0;i<5;i++){
for(int j=0;j<5;j++)
cout<<"("<<path[i][j].first<<","<<path[i][j].second<<")"<<" ";
cout<<endl;
}*/
int p=4;
int q=4;
aa.push_back(p);
bb.push_back(q);
while(!(p==0&&q==0)){
int i,j;
i=p;
j=q;
p=path[i][j].first;
q=path[i][j].second;
aa.push_back(p);
bb.push_back(q);
}
for(int i=aa.size()-1;i>=0;i--)
{
cout<<"("<<aa[i]<<", "<<bb[i]<<")"<<endl;
}
}
int main()
{
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
cin>>a[i][j];
bfs();
return 0;
}