思路:每个坐标有四种状态,每个点对应的每种状态只能走一个方向,如果走到一个重复的状态说明根本不能走到终点,否则继续走即可。
坑点:有可能初始坐标四周都是墙壁,如果不判断下可能会陷入是死循环。
贴上测试数据:
3 3
###
T##
##X
N
AC代码
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 100 + 5;
int vis[maxn][maxn][4];
char G[maxn][maxn];
int n, m;int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
char p[] = {'N', 'E', 'S', 'W'};bool solve(int dir) {memset(vis, 0, sizeof(vis));int x, y;for(int i = 0; i < n; ++i)for(int j = 0; j < m; ++j) {if(G[i][j] == 'T') {x = i, y = j;break;}}vis[x][y][dir] = 1;while(1) {int flag = 0;for(int i = 3; i < 7; ++i) {int r = (dir + i) % 4;int px = x + dx[r], py = y + dy[r];if(px < 0 || py < 0 || px >= n || py >= m || G[px][py] == '#') continue;if(vis[px][py][r]) return false;if(G[px][py] == 'X') return true;vis[px][py][r] = 1;x = px, y = py, dir = r;flag = 1;break;}if(!flag) return false;}return false;
}
int main() {char dir;while(scanf("%d%d", &n, &m) == 2) {for(int i = 0; i < n; ++i) scanf("%s", G[i]);getchar();scanf("%c", &dir);for(int i = 0; i < 4; ++i) {if(p[i] == dir) {if(solve(i)) printf("YES\n");else printf("NO\n");break;}}}return 0;
}
如有不当之处欢迎指出!