/*第一次写搜索,迷宫类型题,搜索题大部分是递归的嵌套,这题是典型的位置移动题,可以单独开一个数组来存位置移动的坐标,int dir[][],分别为上下左右,是根据不撞南墙不回头,一撞南墙就回头,通过搜索找到这个目标是否可以,当全部走过就可以确定是否能找到这个目标点*/ #include<stdio.h> #include<string.h> int n, m; int sx, sy, ex, ey; int flag; int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };//方位定位; int vis[520][520]; //标记的路是否做过,走过的路不在走; char str[520][520]; void dfs(int px, int py) { vis[px][py] = 1; if ( px == ex && py == ey) flag = 1; for (int i = 1; i <= 4; i++) { int xx = px + dir[i][0]; //计算新的坐标; int yy = py + dir[0][i]; if (str[xx][yy] != '#' && !vis[xx][yy] && xx < n && xx >= 0 && yy < m && yy >= 0) { dfs(xx, yy); //判断这个点是不是ex,ey; } } } int main() { while (~scanf("%d%d", &n, &m)) { memset(vis, 0, sizeof(vis)); flag = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf(" %c", &str[i][j]); if (str[i][j] == 'S') { sx = i; sy = j; } if (str[i][j] == 'E') { ex = i; ey = j; } } } dfs(sx, sy); if (flag) printf("Yes\n"); else printf("No\n"); } return 0; }