经过思考蒜头君终于解决了怎么计算一个迷宫的最短路问题,于是蒜头君找到一个新的迷宫图,来验证自己是否真的会计算一个迷宫的最短路。
为了检验自己计算的是否正确,蒜头君特邀你一起来计算。
输入格式
第一行输入两个整数 nn 和 mm,表示这是一个 n \times mn×m 的迷宫。
接下来的输入一个 nn 行 mm 列的迷宫。其中’@‘表示蒜头君的位置,’#‘表示墙,蒜头君无法通过,’.‘表示路,蒜头君可以通过’.‘移动,所有在迷宫最外围的’.'都表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。
输出格式
输出整数,表示蒜头君逃出迷宫的最少步数,如果蒜头君无法逃出迷宫输出 -1−1。
数据范围
1 \le n,m \le 151≤n,m≤15。
输出时每行末尾的多余空格,不影响答案正确性
样例输入1
9 13
#############
#@…#
#####.#.#.#.#
#…#
#.#.#.#.#.#.#
#.#…#.#
#.#.#.#.#.#.#
#…#
#####.#######
样例输出1
11
样例输入2
4 6
#.####
#.#.##
#…@#
样例输出2
5
#include <iostream>
using namespace std;
int n,m,sx,sy,fx,fy,step=0,t=999; ///n行m列,(sx,sy)起点行列,(fx,fy)终点行列,ans能到达终点的路径数,step步数,t中间值
int xx[]={1,0,-1,0}; ///移动方向;上下左右
int yy[]={0,1,0,-1};
char mp[16][16]; ///地图数组
bool vis[16][16]; ///标记数组
void dfs(int x,int y,int step)
{
if(( x == 1 || x == n )||( y == 1 || y == m )){ ///判断是否到达出口
if(t>step){
t=step;
}
return;
}
for(int i=0 ; i<4 ; i++){ ///遍历四个方向,到达下一个坐标
int dx=x+xx[i]; /// (dx,dy)下一个坐标行列
int dy=y+yy[i];
if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!vis[dx][dy]&&mp[dx][dy]!='#'){ ///移动限制条件
vis[dx][dy]=1;
dfs(dx,dy,step+1); ///递归回溯,只能为step+1,"step++"先取值运算,再自增
vis[dx][dy]=0;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if( mp[i][j] == '@' ){ ///获取起点
sx=i;
sy=j;
}
}
}
dfs(sx,sy,step);
if( t == 999 ){ ///判断有无出口,若无出口,则t不变
cout<<"-1"<<endl;
}
else{
cout<<t<<endl;
}
return 0;
}