计蒜客------迷宫(一)

题目描述

一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道。看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路。

输入格式

第一行输入两个整数 n n n m m m,表示这是一个 n ∗ m n*m nm的迷宫。接下来的输入一个 n n n m m m 列的迷宫。其中 ‘S’ 表示蒜头君的位置,’*‘表示墙,蒜头君无法通过,’.‘表示路,蒜头君可以通过’.'移动,'T’表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。

输出格式

输出一个字符串,如果蒜头君可以逃出迷宫输出"yes",否则输出"no"。

数据范围

1 ≤ n , m ≤ 10 1 \leq n,m \leq 10 1n,m10

样例输入1

3 4
S**.
..*.
***T

样例输出1

no

样例输入2

3 4
S**.
....
***T

样例输出2

yes

算法
深度优先搜索
是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

C++代码

#include 
#include 
#include 

using namespace std;

int n,m;
bool f;
char mp[15][15];  //maze  迷宫
int vis[15][15];  //标记
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};  //方向

bool in(int x,int y){
    return x >= 0 && x < n && y >= 0 && y < m;
}

void dfs(int x,int y){
    if(mp[x][y] == 'T'){  //判断是否到达终点
        f = true;
        return;
    }
    if(!in(x,y)||mp[x][y]=='*'||vis[x][y]){  //点是否在范围内,点是否可走,点是否被访问过
        return ;
    }
    vis[x][y] = 1;
    

    for(int i = 0;i < 4;i++){
        int tx = x + dir[i][0];
        int ty = y + dir[i][1];
        dfs(tx,ty);
    }
    return;
}

int main(){

    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i++){
        scanf("%s",mp[i]);
    }
    int x,y;
    for(int i = 0;i < n;i++) {  //找终点
        for (int j = 0; j < m; j++) {
            if (mp[i][j] == 'S') {
                x = i;
                y = j;
            }
        }
    }
    dfs(x,y);
    if(f)
        printf("yes\n");
    else
        printf("no\n");
    return 0;
}

你可能感兴趣的:(ACM题解)