走出迷宫【所用算法——dfs】

走出迷宫

https://ac.nowcoder.com/acm/problem/14572

dfs为深搜算法,他会一直走到底
所以用dfs算法,一定如果有通路的话,他一定可以从头走到尾。

#include <iostream>
#include <cstring>

using namespace std;

const int N = 510;

int n, m, t;//t标记是否走到出口
char g[N][N];//作为全局变量,可以在dfs里使用
int d[N][N];//作为全局变量,可以在dfs里使用

void dfs(int sx, int sy){
    if (g[sx][sy] == 'E') t = 1;

    int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};//坐标偏移量
    for (int i = 0; i < 4; i ++ ){
        int x = sx + dx[i], y = sy + dy[i];//通过加上坐标偏移量实现坐标上下左右移动
        if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] != '#' && !d[x][y]){
            //前四个是判断当前位置是否出界,第五个是判断所在位置是否为通路,最后判断是否走过
            d[x][y] = 1;//标记当前位置走过了
            dfs(x, y);//dfs下一个位置
        }
    }
}
int main(){
    while(cin >> n >> m){
        int sx, sy;
        t = 0;//多组数据,给他初始化一下
        memset(g, 0, sizeof g);//多组数据,给他初始化一下
        memset(d, 0, sizeof d);//多组数据,给他初始化一下

        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < m; j ++ ){
                cin >> g[i][j];
                if (g[i][j] == 'S') sx = i, sy = j;//标记起点的下标
            }

        dfs(sx, sy);//从起点开始遍历

        if (t) puts("Yes");//输出加换行
        else puts("No");//输出加换行
    }

    return 0;
}
全部评论
简单易懂,厉害
点赞 回复 分享
发布于 2023-03-26 14:16 河南
清晰明了
点赞 回复 分享
发布于 2022-02-17 22:25
大佬,请问为什么这个不用回溯 , 为什么 dfs(x , y)下面不用加 d[x][y] = 0 ?
点赞 回复 分享
发布于 2021-08-02 16:04

相关推荐

稚名不带撇:感觉学院本就已经废了,不是能不能进公司的问题了,是根本就没有啥面试,boss沟通了一千多,回我消息的才89,面试的才二十几个,但基本上都是小公司点击就送,唯一一次有1000+的公司面试,面的很好全回答出来了,项目这块个人感觉也说的不错,甚至面试官最后还直接给我介绍公司业务和看公司系统这些,介绍的也比较详细,说了40分钟到一个小时左右,说怕给我offer我不喜欢这种模式啥啥啥的,鼠鼠以为应该稳了,但是最后还是挂了,我问我们老师他说这种情况大概率是学历比你高的出现了,虽然可能问题没有全回答出来,但是学历把你爆了
秋招,不懂就问
点赞 评论 收藏
分享
评论
7
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务