问题描述
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0表示可以走的路,1 表示不可通过的墙壁。
最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。
数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
问题求解
广度优先遍历。
思路:从起点开始,往前走第一步,记录下所有第一步能走到的点,然后从所第一步能走到的点开始,往前走第二步,记录下所有第二步能走到的点,重复下去,直到走到终点。输出步数即可。
· 用 g 存储地图,f存储起点到其他各个点的距离。
· 从起点开始广度优先遍历地图。
· 当地图遍历完,就求出了起点到各个点的距离,输出f[n][m]即可。
代码实现
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int ,int> PII;
const int N =110;
queue <PII> q;
int graph[N][N];
int f[N][N];
int n,m;
void bfs(int a, int b){
q.push({a,b});
while(!q.empty())
{
PII start = q.front();
q.pop();
graph[start.first][start.second] = 1;
for(int i = 0; i<4; i++){
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int x = start.first + dx[i];
int y = start.second + dy[i];
if(graph[x][y] == 0){
graph[x][y] =1;
f[x][y] = f[start.first][start.second] +1;
q.push({x,y});
}
}
}
cout<<f[n][m];
}
int main(){
cin>>n>>m;
memset(graph, 1, sizeof(graph));
for(int i=1; i<=n;i++){
for(int j =1; j<=m; j++){
cin>>graph[i][j];
}
}
bfs(1,1);
}