# 问题描述
小水獭不小心走进了一个迷宫,水獭害怕极了,请你帮助小水獭在迷宫中找到出口。
小水獭从起点 出发,它的目标是到达出口的位置 。小水獭的移动方向有限:它可以向北 (N)、向东 (E)、向南 (S) 或向西 (W) 移动,具体的移动规则如下:
N
表示向上移动一步,即从位置 移动到 。E
表示向右移动一步,即从位置 移动到 。S
表示向下移动一步,即从位置 移动到 。W
表示向左移动一步,即从位置 移动到 。
小水獭将按顺序执行移动指令字符串(例如 NEWS
表示依次向北、东、南、西移动)。如果移动过程中经过出口 ,那么小水獭成功逃出迷宫。
在迷宫中,有一些障碍。如果小水獭在某次移动时目标位置是一个障碍,则该次移动无效,小水獭会停留在当前格子位置,不会移动到障碍物所在的格子上。例如,如果小水獭当前位于 ,且向东移动的目标位置 是一个障碍,则小水獭无法移动到 ,它会停留在 这个位置,继续执行接下来的指令。
请你判断小水獭是否可以成功逃出迷宫,离开出口。
# 输入格式
不定组测试数据,保证输入的数据组数不超过 组。
每组数据第一行,输入两个正整数 ;表示出口的位置,保证 。
每组数据第二行,输入一个字符串 ,表示水獭的移动指令序列,保证 。
接下来 行,每行输入两个数字 表示第 个障碍物的位置,保证 。
# 输出格式
对于每组数据,输出一行字符串。如果小水獭成功逃出迷宫,输出 Otter Success
;否则输出 Otter Failed
。
# 输入样例
1 2 2 | |
SNNENEEN | |
1 1 | |
1 5 5 | |
SNNENEEN | |
1 1 |
# 输出样例
Otter Success | |
Otter Failed |
# 样例解释
对于第一组数据,小水獭的移动过程如下:
S
:N
:N
:
由于 有障碍,所以小水獭停在 不动N
:E
:E
:,小水獭成功到达终点,逃出迷宫N
:小水獭已经离开迷宫,剩下的操作就不用管了
对于第二组数据,小水獭最后会移动到 ,在整个过程中也没有到达 ,所以无法逃出迷宫。
# 题解:模拟
直接依题意模拟即可,提几个实现的关键点:
-
关于地图障碍物,考虑用一个二维
bool
型数组存储; -
关于行动,定义两个常量数组,表示四个方向 的增量,可以简化代码(走地图问题的常用 trick)
-
仔细读题,细节有点多。一个很容易忽略的细节是:水獭可以走到负数坐标,所以在存储地图时,统一加个 的偏移量,就不会出现负数了。具体参考代码实现。
以下是代码实现:
#include <stdio.h> | |
#include <stdbool.h> | |
#include <string.h> | |
const int moveX[4] = {0, 1, 0, -1}; | |
const int moveY[4] = {1, 0, -1, 0}; | |
int k, a, b; | |
char s[510]; | |
bool map[1010][1010]; | |
int Op(char c) | |
{ | |
switch (c) | |
{ | |
case 'N': return 0; break; | |
case 'E': return 1; break; | |
case 'S': return 2; break; | |
case 'W': return 3; break; | |
default: break; | |
} | |
return 0; | |
} | |
int main() | |
{ | |
// freopen("E.in", "r", stdin); | |
// freopen("E.out", "w", stdout); | |
while (~scanf("%d%d%d", &k, &a, &b)) | |
{ | |
memset(map, 0, sizeof(map)); | |
getchar(); | |
scanf("%s", s); | |
int len = strlen(s); | |
for (int i = 1; i <= k; ++ i) | |
{ | |
int x, y; | |
scanf("%d%d", &x, &y); | |
map[x + 500][y + 500] = true; | |
} | |
int x = 0, y = 0; | |
bool flag = false; | |
for (int i = 0; i < len; ++ i) | |
{ | |
int nx = x + moveX[Op(s[i])], ny = y + moveY[Op(s[i])]; | |
if (!map[nx + 500][ny + 500]) | |
x = nx, y = ny; | |
if (x == a && y == b) | |
{ | |
flag = true; | |
break; | |
} | |
} | |
if (flag) | |
puts("Otter Success"); | |
else | |
puts("Otter Failed"); | |
} | |
return 0; | |
} |