Acwing_844(走迷宫)

原题链接:

844. 走迷宫 - AcWing题库

题解:

本题因为是走迷宫(从起点到终点的最短路径),且无边权,因此更适合用bfs逐层求解。

图片转载自AcWing 844. 走迷宫:图解+代码注释 - AcWing

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
int n, m;
int g[N][N], d[N][N];//g用于存储迷宫,d用于存储迷宫各点距迷宫起点的距离
queue<pair<int,int>> q;//存储当前遍历到的结点

int bfs() {
	memset(d, -1, sizeof(d));//初始化为-1,表示这个点未曾访问过
	d[1][1] = 0;//起点距起点的距离为0
	q.push({ 1,1 });//存入起点
	int dx[] = { 0,0,-1,1 }, dy[] = { -1,1,0,0 };//上下左右四种移动操作
	while (q.size()) {
		auto f = q.front();
		q.pop();
		for (int i = 0;i < 4;i++) {
			int x = f.first + dx[i], y = f.second + dy[i];
			if (x >= 1 && x <= n && y >= 1 && y <= m && g[x][y] == 0 && d[x][y] == -1) {
				d[x][y] = d[f.first][f.second] + 1;
				q.push({ x,y });
			}
		}
	}
	return d[n][m];
}

int main() {
	cin >> n >> m;
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			cin >> g[i][j];
	cout << bfs();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值