bfs之走地图(迷宫)

题目:东东找妹纸。

东东手里有一张神奇的地图,通过地图可以找到妹子!地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。

输入输出要求及样例见下图:

思路:

这是一个需要求解最短路径的问题,考虑使用广度优先搜索配合队列,广度优先搜索是一层一层进行搜索的,一步能到达的点这个方法就不会让你走两步到达(因为在第一层搜索的时候已经把点加入队列了)。由于结果是要求整个路径而不是最小距离,因此在进行bfs时需要记录每一点的上一个位置。

流程如下:

首先将起点加入队列中;

开始循环依次处理队列中的每一个点,处理方法为找到该点相邻的且未被标记的点(用vis数组记录标记信息)加入队列,在处理相邻点的时候使用偏移量dx、dy,由于题目要求路径,因此在讲每个点加入队列的同时记录前一个点在road数组中;

直到终点被标记,整个广度优先搜索过程结束;

因为找到路径时是从终点向起点回溯的,因此找寻出来的路径正常来讲是反序的。这个正序输出的方法相当暴力,没有采取递归的方法。而是从终点开始,找到终点的前一个点a,然后再找点a的前一个点,循环该过程,直至回到起点。在此过程中,将点信息反序保存在了一位数组output中,然后再正序输出,就输出了寻找妹纸的路径。

代码:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int maze[5][5];//迷宫
int dis[5][5];//距离 
pair<int,int> road[5][5];//路径
bool vis[5][5];
pair<int,int> output[25];

queue<pair<int,int> >  q;

const int dx[4] = {0,0,-1,1};//上下左右
const int dy[4] = {1,-1,0,0};//上下左右

void bfs()
{
	memset(vis,false,sizeof vis);
	memset(dis, 63, sizeof dis);
	memset(output, 0, sizeof output);
	pair<int,int> p1(0,0);
	q.push(p1);
	vis[0][0] = true;
	dis[0][0] = 0; 
	road[0][0] = p1;
	while(!q.empty())
	{
		//bool is = false;
		pair<int,int> p = q.front();
		q.pop();
		for(int i=0 ;i<4 ;i++)
		{
			int x = p.first + dx[i];
			int y = p.second + dy[i];
			if(x>=0 && x<5 && y>=0 && y<5 && maze[x][y]==0 && vis[x][y]==false)
			{
				pair<int ,int> p2(x,y);
				q.push(p2);
				dis[x][y] = dis[p.first][p.second] + 1;
				vis[x][y] = true;
				pair<int ,int> p3(p.first,p.second);
				road[x][y] = p3;
				if(x==4 && y==5) break;	
			}
		}
	}
	
	int a =4 ,b = 4;
	int count = 24;
	while(a!=0 || b!=0)//把路径弄到数组output里 
	{
		int u = road[a][b].first;
		int v = road[a][b].second;
		pair<int ,int> p4(u,v);
		output[count--] = p4;
		a = u;
		b = v;
	}
	cout<<"(0, 0)"<<endl;
	for(int i=0 ;i<25 ;i++)
	{
		if(output[i].first==0 && output[i].second==0)
			continue;
		cout<<"("<<output[i].first<<", "<<output[i].second<<")"<<endl;
	}
	cout<<"(4, 4)"<<endl;	
}

int main()
{
	for(int i=0 ;i<5 ;i++)
		for(int j=0 ;j<5 ;j++)
			cin>>maze[i][j];
			
	bfs();
}
扫描二维码关注公众号,回复: 9594335 查看本文章
发布了3 篇原创文章 · 获赞 4 · 访问量 197

猜你喜欢

转载自blog.csdn.net/weixin_44876049/article/details/104637717