Acwing-走迷宫

*给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 01,其中 0 表示可以走的路,1 表示不可通过的墙壁。*

最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。

数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。

输入格式
第一行包含两个整数 n 和 m。

接下来 n 行,每行包含 m 个整数(01),表示完整的二维数组迷宫。

输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围
1≤n,m≤100
输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8
#include"iostream"
#include"cstring"
#include"queue"
using namespace std;
const int N=105;
int mp[N][N];
int n,m;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int dist[N][N];//用dist记录各个点到起点的距离,通过标记点一次性可以减少搜索4个点,避免超时。
struct node{//用结构体存储下标x,y(通过队列结构体版本)
	int x,y;
}; 
int bfs(){
	memset(dist,-1,sizeof dist);
	queue<node> q;
	q.push({1,1});
	dist[1][1]=0;
	while(!q.empty()){
		for(int i=0;i<4;i++){
			int xx=q.front().x+dx[i];
			int yy=q.front().y+dy[i];
			if(!mp[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=m&&dist[xx][yy]==-1){//访问条件限制
				q.push({xx,yy});
				dist[xx][yy]=dist[q.front().x][q.front().y]+1;
				//类似于dijstra算法中的dist[x][y]>dist[x]+mp[x][y]的更新,把它看成权值都为1的图(权值都为1的图==二维数组)
			}
		}
		q.pop();
	} 
	return dist[n][m];
}
int main(){
	cin>>n>>m;
	int a; 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>a;mp[i][j]=a;
		}
	cout<<bfs();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值