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;
}
京公网安备 11010502036488号