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