D - 迷宫(三)

经过思考蒜头君终于解决了怎么计算一个迷宫的最短路问题,于是蒜头君找到一个新的迷宫图,来验证自己是否真的会计算一个迷宫的最短路。

为了检验自己计算的是否正确,蒜头君特邀你一起来计算。

输入格式
第一行输入两个整数 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;
}

发布了12 篇原创文章 · 获赞 0 · 访问量 174

猜你喜欢

转载自blog.csdn.net/qq_45981086/article/details/104151277