这个题教会我DFS不要写成for循环的形式
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <iostream> using namespace std; const int MAX = 10; int m, n, t, sx, sy, flag, vis[MAX][MAX]; int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; char map[MAX][MAX]; void DFS(int x, int y, int step) { if(step > t || flag) { return ; } if (map[x][y] == 'D' && step == t) { flag = 1; return; } if (map[x][y] == '.' || map[x][y] == 'S') { vis[x][y] = 1; //AC // if(x + 1 >= 1 && x + 1 <= m && y >= 1 && y <= n && vis[x + 1][y] ==0 ) // DFS(x + 1, y, step + 1); // if(x - 1 >= 1 && x - 1 <= m && y >= 1 && y <= n && vis[x - 1][y] ==0 ) // DFS(x - 1, y, step + 1); // if(x >= 1 && x <= m && y + 1 >= 1 && y + 1 <= n && vis[x][y + 1] ==0 ) // DFS(x, y + 1, step + 1); // if(x >= 1 && x <= m && y - 1 >= 1 && y - 1 <= n && vis[x][y - 1] ==0 ) // DFS(x, y - 1, step + 1); //TL for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if(nx >= 1 && nx <= m && ny >= 1 && ny <= n && vis[nx][ny] == 0) { DFS(nx, ny, step + 1); } } vis[x][y] = 0; } } int main() { while (scanf("%d%d%d", &m, &n, &t), m + n + t) { getchar(); flag = 0; memset(vis, 0, sizeof(vis)); for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { map[i][j] = getchar(); if (map[i][j] == 'S') { sx = i; sy = j; } } getchar(); } DFS(sx, sy, 0); printf(flag?"YES\n":"NO\n"); } return 0; }