题目
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。
最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。
数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。
输入格式
第一行包含两个整数n和m。
接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围
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
思路
BFS在于求最短路径,而且层形解决问题,走过的点不能走,一般的模板:
1.创建一个队列(队列的先进先出的特点可以保持一层一层遍历),并用一个二维的数据来存放每一个点到起点的距离
2.取出队列的头元素,并且pop出
3.对于该元素找到周围距离为1的点,存入距离数组和对列(当然要符合条件),直到队列为空
4.输出最后到达点的的距离
代码
#include <iostream>
#include <string>
#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e2 + 7;
int g[N][N], d[N][N];
int n, m;
int bfs() {
int dx[] = { -1, 0, 1, 0 }, dy[] = { 0, 1, 0, -1 };
memset(d, -1, sizeof(d)); //初始化d,-1表示没有走过
d[0][0] = 0;//把起点距离初始化
queue<pair<int,int>> q;
q.push({0,0});//先存入起点
while (!q.empty()) {
int x = q.front().first;//获取队头元素
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int x1 = x + dx[i];
int y1 = y + dy[i];
if (x>=0&&y>=0&&x<n&&y<m&&!g[x1][y1] && d[x1][y1] == -1) {
d[x1][y1] = d[x][y] + 1;
q.push({ x1,y1 });
}
}
}
return d[n - 1][m - 1];
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> g[i][j];
}
}
cout << bfs() << endl;
system("pause");
}