# 问题描述
小水獭不小心走进了一个迷宫,水獭害怕极了,请你帮助小水獭在迷宫中找到出口。
小水獭从起点 出发,它的目标是到达出口的位置 。小水獭的移动方向有限:它可以向北 (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;  | |
} |