走迷宫-蓝桥杯

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是一道经典的bfs搜索题目,前几年蓝桥杯酷爱出这种题目,我记着2019年就B组就出过一道走迷宫题,不过那道题可以拿Excel走出来。下面我们对这道题目进行分析,先开一个二维数组定义可能走的路径,用结构体来确定带点的坐标和步长,写bfs时通过引入队列来进行搜索,再结合标记数组将访问过的路径置为1(true),未访问过的看作0,最后判断入栈,最终得出结果。贴上代码。

#include<iostream>
#include<queue>
using namespace std;
const int N=110;
int a[N][N];
int vis[N][N];      //标记数组,是否路径已经被范围过 
int n,m;
int x1,y1,x2,y2;    //定义入口和出口的位置

int p[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //定义可能的移向位置 

struct node      //定义结构体 ,定义位置坐标和步长 
{
	int x,y,step;    
}; 
bool check(int x,int y)
{
	if(x<1||x>n||y<1||y>m || vis[x][y] || !a[x][y])
	   return false;
	else
	   return true;
}
int bfs(int x,int y)
{
	queue<node> que;
	que.push(node{x,y,0});    //队列入队迷宫的起点
	vis[x][y]=1;          //标记这条路已经走过
	while(!que.empty())
	{
		node u=que.front();    //取出队列的队首元素 
		que.pop();    //出队 
		if(u.x==x2&&u.y==y2)   //已经走完了迷宫 
		{
			return u.step;  
		} 
		for(int i=0;i<=3;i++)    //可以走四个方向 
		{
			int move1=u.x+p[i][0];
			int move2=u.y+p[i][1];
			if(!check(move1,move2))
			{
			   continue;
			}   
			vis[move1][move2]=true;
			que.push( node{move1,move2,u.step+1} ); 
		} 
	}
	return -1;
}
int main()
{
     cin>>n>>m;
     for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)
      	cin>>a[i][j];
     	  
	 cin>>x1>>y1>>x2>>y2;
	 cout<<bfs(x1,y1)<<endl;
	return 0;
} 

问题得到结局。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值