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;
}