题目:小迷突然有一天想去玩迷宫,迷宫表现为一个n×m 的网格,网格上只有两种情况: 无障碍物和障碍物。
如果他在坐标为 (i,j) 的网格里,他可以选择 (i+1,j),(i,j+1),(i−1,j),(i,j−1) 四个方向行走,小迷想知道走出迷宫的最短路径是多少,如果走不出去输出-1;
输入:第一行两个整数 n,m(1≤n,m≤2000);
第二行四个整数sx,sy,ex,ey(1≤sx,ex≤n,1≤sy,ey≤m) 表示起点与终点的坐标;
输出:一行一个整数,表示最短距离,若出不去输出-1;
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1000][1000];//用数组去表示迷宫
int b[1000][1000];//标记数组
int v=999999;//初始化步数,的得到最小的步数
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};//表示向上下左右四个方向移动
void dfs(int x1,int y1,int x2,int y2,int step){
if(x1==x2&&y1==y2) {//如到达了终点坐标,去判断这条路走的是否比之前走的路径要小
if(step<v){
v=step;
}
return;
}
for(int i=0;i<=3;i++){//上下左右四个方向依次遍历
int tx=x1+dx[i];
int ty=y1+dy[i];
if(tx<1||tx>n||ty<1||ty>m) continue;//表示超出了迷宫的边界,就不进行遍历
if(a[tx][ty]==0&&b[tx][ty]==0){//表示这一格无障碍物且没被标记
b[tx][ty]=1;//标记一下这个位置被走过
dfs(tx,ty,x2,y2,step+1);
b[tx][ty]=0;//回溯
}
}
return ;
}
int main(){
cin>>n>>m;//表示迷宫大小n*m
int ax,ay,ex,ey;
cin>>ax>>ay>>ex>>ey;// 表示起始和结束的坐标
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];//1表示有障碍物,0表示无障碍物
}
}
dfs(ax,ay,ex,ey,0);//广度优先遍历
b[ax][ay]=1;
printf("这个迷宫的最短路径:");
v==999999?cout<<-1:cout<<v;
return 0;
}版权声明:本文为WXLGL原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。