大胖子走迷宫

本文介绍了一个编程题目,通过广度优先搜索(BFS)方法帮助小明在受体型限制的迷宫中找到最短路径。代码实现中利用vis数组记录了每个节点的最短距离,确保每次移动都遵循最短路径原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 原题0大胖子走迷宫 - 蓝桥云课 (lanqiao.cn)

 直接上代码:(该代码借鉴的是题解中博主谦言万语的代码)

#include<iostream>
#include<queue>
using namespace std;
char map[310][310];//地图 
int vis[310][310];//标记数组
int n,k,t;//n行数,k时间,t小明的体型 
//上下左右 
const int dr[]={0,0,1,-1};
const int dc[]={-1,1,0,0};

//存放节点的位置x,y,并且记录所所用时间 
typedef struct node{
	int x,y,dis; 
	node(int x=0,int y=0,int dis=0):x(x),y(y),dis(dis) {}
}node; 

//判断小明是否还在里面 
bool isInside(int dx,int dy)
{
	if(dx>=t/2&&dx<=n-t/2-1&&dy>=t/2&&dy<=n-t/2-1)
	return true;
	return false;
}

//判断小明是否被障碍物卡住 
bool isKa(int dx,int dy)
{
	for(int i=dx-t/2;i<=dx+t/2;i++)
	{
		for(int j=dy-t/2;j<=dy+t/2;j++)
		{
			if(map[i][j]=='*') return true;
		}
	}
	return false;	
}

//广度优先搜索BFS 
void bfs()
{
	queue<node> q;//队列
	node u(2,2,0);//初始节点 
	vis[2][2]=1;//标记起点 
	q.push(u);//初始节点进栈
	while(!q.empty())
	{
		node u=q.front();//记录目前的节点 
		q.pop();//节点出栈
		
		//到达终点,结束 
		if(u.x==n-3&&u.y==n-3)//位置都是从0开始标记,所以此时终点位置在(n-3,n-3) 
		{
			cout<<u.dis;
			return;
		 } 
		//记录小明的体型 
		if(u.dis<k) t=5;
		else if(u.dis>=k&&u.dis<2*k)t=3;
		else if(u.dis>=2*k) t=1; 
		
		if(t!=1)q.push(node(u.x,u.y,u.dis+1));//当体型大时,假设小明就在此等待身体缩小 
		
		//遍历四个方向 
		for(int i=0;i<4;i++)
		{
			int nx=u.x+dr[i];
			int ny=u.y+dc[i];
			if(isInside(nx,ny)&&!vis[nx][ny]&&!isKa(nx,ny))//移动位置时,确保小明还能在范围内且该地没被走过且此地没有障碍物 
			{
				vis[nx][ny]=1;
				node v(nx,ny,u.dis+1);
				q.push(v);
			}
		} 
	 } 
}
int main()
{
	cin>>n>>k;
	for(int i=0;i<n;i++)
	cin>>map[i];
	bfs();
	return 0;
}

解析:

为何能达到最短路径的效果?

因为用vis记录了,一步一步往外走,而每个vis为最短距离的vis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值