bfs-迷宫问题

题意:
输入是一个5 × 5的二维数组,仅由0、1两数字组成,表示法阵地图。0表示可以走,1表示不可以走,左上角是入口,右下角是出口,找出左上角到右下角的最短路径
(数据保证有唯一解)
思路:
进行bfs,出口(0,0)设为bfs的起点,一层一层的向外扩展,第一次到达出口时此时的层数也就是最短的步数,路径可以通过记录前驱节点递归输出路径,vis[i][j]来记录点的状态,0代表未到过且可以到达,1代表不能通过,-1代表到达过,path[i][j]是自定义结构体顶点类型point的数组,用来记录顶点的前驱,对于每层向外扩展时分为上下左右四个方向,用int 型数组dx,dy来做为偏移量,进行广搜,判断是否可以到达,是否在边界内。
总结:
对于迷宫问题寻找最短路径就是无向图寻找最短路径问题,最常用的方法就是进行bfs搜索,bfs利用队列实现,最主要的是特判的条件(即是否到达终点),记录搜索时每个点的状态,并且记录每个节点的前驱节点以便输出路径,还有小技巧就是上下左右四个方向可以用数组来来记录偏移量dx,dy,然后循环遍历即可。
代码:

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

int dx[]={0,0,1,-1};//偏移量
int dy[]={1,-1,0,0};
int vis[7][7];//记录点的状态
int sx,sy,tx,ty;
struct point
{
	int x,y;
}; 
point path[7][7];//记录前驱
void print(point t)
{   if(t.x==sx&&t.y==sy)
   { 
		cout<<"("<<t.x<<","<<' '<<t.y<<")"<<endl;return;
   } 
	print(path[t.x][t.y]);
	cout<<"("<<t.x<<","<<' '<<t.y<<")"<<endl; return;
}

void bfs()
{    queue<point>q; vis[sx][sy]=-1;
    point p;p.x=sx;p.y=sy;q.push(p);path[sx][sy]=p;
    while(!q.empty())
    {	point now=q.front();q.pop();
        if(now.x==tx&&now.y==ty)   //特判是否到达出口
		{ print(now);
		return;
		} 
        for(int i=0;i<4;i++)//循环扩展
    	{      
    			 int x=now.x+dx[i];int y=now.y+dy[i];
    			if(vis[x][y]==0&&x>=0&&x<5&&y>=0&&y<5)
    			{   point pp;pp.x=x;pp.y=y;
    				q.push(pp);vis[x][y]=-1;path[x][y]=now;	
				}
		}	
	}	
}

int main()
{ 
	for(int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
		cin>>vis[i][j];
	}
	 sx=0;sy=0;tx=4; ty=4;
	bfs();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值