Salvation
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身。 Klaus(吸血鬼祖先) 为了利用 Elena 的血液发展他的混血大军(吸血鬼&狼人),也来到了神秘瀑布镇。Stefan 因为深爱着 Elena ,于是 Stefan 决定去唤醒吸血鬼猎人,来解救 Elena 。
吸血鬼猎人被封锁在一个迷宫里,这个迷宫有一种特性,只要进入就会失去方向感。于是 Stefan 想到一种方法,以左为标准(即优先左走),其次向前,向右,如果都无法走就向后走(即向右转两次)。他可以向上下左右四个方向的空格移动一个格,每次耗费1分钟。Stefan 在得知你是一个有天赋的程序员后,决定让你判断他是否能找到吸血鬼猎人。
-
输入
-
输入包含多组测试数据,第一行输入 n , m ( 2 < n ,m <= 100) ,接下来n行每行m个字符,第 n + 2 行一个字符表示初始方向(E W S N)。
“.”代表空格 ,“#”代表墙 , “ T ”代表初始位置,“X”代表吸血鬼猎人的位置。
输出
- 输出一行,如果能找到输出“YES”,否则输出“NO”。 样例输入
-
4 4 .... .##. .##. TX.. N 4 4 .... .##. .### T#.X N
样例输出
-
YES NO
提示
-
优先左走即:如果左边能走就向左走,如果不能走向前走,如果前不能走,向右走,如果右不能走向后走。
这个题最重要的是方向,注意方向的改变
#include <iostream> #include <cstring> using namespace std; const int maxn = 110; int n, m; char map[maxn][maxn]; int vis[maxn][maxn]; int flag; char ch; int sx, sy, ex, ey; int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; void dfs(int DS, int x, int y) { if (x == ex && y == ey){ flag = 1; return; } for (int i = 1; i > -3; i--){ int ds = (DS + i + 8) % 4; int dx = x + dir[ds][0]; int dy = y + dir[ds][1]; if (dx >= 0 && dx < n && dy >= 0 && dy < m && map[dx][dy] != '#'){ if (vis[dx][dy] == 4) return; vis[dx][dy]++; dfs(ds, dx, dy); return; } } return; } int main() { int DS; while (cin >> n >> m){ memset(vis, 0, sizeof(vis)); flag = 0; for (int i = 0; i < n; i++){ cin >> map[i]; for (int j = 0; j < m; j++){ if (map[i][j] == 'T') sx = i, sy = j; if (map[i][j] == 'X') ex = i, ey = j; } } cin >> ch; if (ch == 'N') DS = 0; else if (ch == 'W') DS = 1; else if (ch == 'S') DS = 2; else DS = 3; vis[sx][sy] = 1; dfs(DS, sx, sy); if (flag) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
-
输入包含多组测试数据,第一行输入 n , m ( 2 < n ,m <= 100) ,接下来n行每行m个字符,第 n + 2 行一个字符表示初始方向(E W S N)。