A - Maze 迷宫问题

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;
}
发布了19 篇原创文章 · 获赞 0 · 访问量 661

猜你喜欢

转载自blog.csdn.net/Hdjjdsbjj/article/details/104603054