BFS——广度优先探索相关视频讲解
题目描述
相关题目链接
给定一个 N×M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示)。
已知迷宫的入口位置为 (x1,y1)(x1 ,y1),出口位置为 (x2 , y2)(x2,y2)。问从入口走到出口,最少要走多少个格子。
输入描述
输入第 1 行包含两个正整数 N,M,分别表示迷宫的大小。
接下来输入一个 N×M 的矩阵。若 Gi,j=1 表示其为道路,否则表示其为障碍物。
最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。
输出描述
输出仅一行,包含一个整数表示答案。若无法从入口到出口,则输出 -1。
输入输出样例
- 示例1:
- 输入:
5 5
1 0 1 1 0
1 1 0 1 1
0 1 0 1 1
1 1 1 1 1
1 0 0 0 1
1 1 5 5
- 输出
8
- 相关代码
相关代码链接
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//二维数组a用于存放输入的迷宫
//二维数组v用于存放标记该坐标有没有走过,没有走过是0,走过的将初始值改为1
int a[100][100]={0};
int v[100][100]={0};
//创建点在右下左上四个方向移动进行的坐标值改变(逆时针)
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
// 创建一个结构体 记录移动点的坐标以及移动到该点所走的步数
struct point{
int x;
int y;
int step;
};
// 创建一个队列 将每一个符合条件的对象压入到队列之中
queue<point> r;
int main()
{
// 请在此输入您的代码
int startx,starty;
int endx,endy;
int n,m;
//输入迷宫的行数和列数
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
//创建一个对象
point start;
cin>>startx>>starty>>endx>>endy;
start.x=startx;
start.y=starty;
start.step=0;
v[startx][starty]=1;
r.push(start);
int flag=0;
while(!r.empty()){
int x=r.front().x;
int y=r.front().y;
if(x==endx&&y==endy){
flag=1;
cout<<r.front().step;
break;
}
for(int k=0;k<4;k++){
int tempx,tempy;
tempx=r.front().x+dx[k];
tempy=r.front().y+dy[k];
if(a[tempx][tempy]==1&&v[tempx][tempy]==0){
point temppoint;
temppoint.x=tempx;
temppoint.y=tempy;
temppoint.step=r.front().step+1;
r.push(temppoint);
v[tempx][tempy]=1;
}
}
r.pop();
}
if(flag==0){
cout<<"-1";
}
return 0;
}