# 问题描述

小水獭不小心走进了一个迷宫,水獭害怕极了,请你帮助小水獭在迷宫中找到出口。

小水獭从起点 (0,0)(0, 0) 出发,它的目标是到达出口的位置 (a,b)(a, b)。小水獭的移动方向有限:它可以向北 (N)、向东 (E)、向南 (S) 或向西 (W) 移动,具体的移动规则如下:

  • N 表示向上移动一步,即从位置 (x,y)(x, y) 移动到 (x,y+1)(x, y+1)
  • E 表示向右移动一步,即从位置 (x,y)(x, y) 移动到 (x+1,y)(x+1, y)
  • S 表示向下移动一步,即从位置 (x,y)(x, y) 移动到 (x,y1)(x, y-1)
  • W 表示向左移动一步,即从位置 (x,y)(x, y) 移动到 (x1,y)(x-1, y)

小水獭将按顺序执行移动指令字符串(例如 NEWS 表示依次向北、东、南、西移动)。如果移动过程中经过出口 (a,b)(a, b),那么小水獭成功逃出迷宫。

在迷宫中,有一些障碍。如果小水獭在某次移动时目标位置是一个障碍,则该次移动无效,小水獭会停留在当前格子位置,不会移动到障碍物所在的格子上。例如,如果小水獭当前位于 (2,2)(2, 2),且向东移动的目标位置 (3,2)(3, 2) 是一个障碍,则小水獭无法移动到 (3,2)(3, 2),它会停留在 (2,2)(2, 2) 这个位置,继续执行接下来的指令。

请你判断小水獭是否可以成功逃出迷宫,离开出口。

# 输入格式

不定组测试数据,保证输入的数据组数不超过 55 组。

每组数据第一行,输入两个正整数 a,ba, b;表示出口的位置,保证 1a,b101 \leq a, b \leq 10

每组数据第二行,输入一个字符串 ss,表示水獭的移动指令序列,保证 1s5001 \leq |s| \leq 500

接下来 kk 行,每行输入两个数字 xi,yix_i, y_i 表示第 ii 个障碍物的位置,保证 1xi,yi101 \leq x_i, y_i \leq 10

# 输出格式

对于每组数据,输出一行字符串。如果小水獭成功逃出迷宫,输出 Otter Success ;否则输出 Otter Failed

# 输入样例

1 2 2
SNNENEEN
1 1
1 5 5
SNNENEEN
1 1

# 输出样例

Otter Success
Otter Failed

# 样例解释

对于第一组数据,小水獭的移动过程如下:

  • S(0,0)(0,1)(0, 0) \rightarrow (0, -1)
  • N(0,1)(0,0)(0, -1) \rightarrow (0, 0)
  • N(0,0)(0,1)(0, 0) \rightarrow (0, 1)
    由于 (0,1)(0, 1) 有障碍,所以小水獭停在 (0,1)(0, 1) 不动
  • N(0,1)(0,2)(0, 1) \rightarrow (0, 2)
  • E(0,2)(1,2)(0, 2) \rightarrow (1, 2)
  • E(1,2)(2,2)(1, 2) \rightarrow (2, 2),小水獭成功到达终点,逃出迷宫
  • N :小水獭已经离开迷宫,剩下的操作就不用管了

对于第二组数据,小水獭最后会移动到 (2,3)(2, 3),在整个过程中也没有到达 (5,5)(5, 5),所以无法逃出迷宫。

# 题解:模拟

直接依题意模拟即可,提几个实现的关键点:

  1. 关于地图障碍物,考虑用一个二维 bool 型数组存储;

  2. 关于行动,定义两个常量数组,表示四个方向 x,yx, y 的增量,可以简化代码(走地图问题的常用 trick)

  3. 仔细读题,细节有点多。一个很容易忽略的细节是:水獭可以走到负数坐标,所以在存储地图时,统一加个 500500 的偏移量,就不会出现负数了。具体参考代码实现。

以下是代码实现:

#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;
}