机器人 (robot. cpp/c/pas)

题目描述

早苗入手了最新的 Gundam 模型. 最新款自然有着与以往不同的功能, 那就是它能够自动行走, 厉害吧. 早苗的新模型可以按照输入的命令进行移动, 命令包括 ‘E’、‘S’、‘W’、‘N’ 四种, 分别对应东南西北. 执行某个命令时, 它会向对应方向移动一个单位. 作为新型机器人, 它可以执行命令串. 对于输入的命令串, 每一秒它会按命令行动一次. 执行完命令串的最后一个命令后, 会自动从头开始循环. 在 0 时刻时机器人位于 (0, 0). 求 T 秒后机器人所在位置坐标.

输入格式

第 1 行: 一个字符串, 表示早苗输入的命令串, 保证至少有 1 个命令

第 2 行: 一个正整数 T

输出格式

2 个整数, 表示 T 秒时, 机器人的坐标.

样例输入

NSWWNSNEEWN
12

样例输出

-1 3

数据范围

对于 60% 的数据 \(T \leq 500000\) 且命令串长度 \(\leq 5000\)

对于 100% 的数据 \(T \leq 2000000000\) 且命令串长度 \(\leq 5000\)

注意

向东移动, 坐标改变改变为 (X+1, Y);

向南移动, 坐标改变改变为 (X, Y-1);

向西移动, 坐标改变改变为 (X-1, Y);

向北移动, 坐标改变改变为 (X, Y+1);

Explanation

预处理一下运动状态然后简单模一下就可以了

水题一枚~

Source Code


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;
typedef long long lli;
const int maxn = 5010;

char str[maxn];
lli states[maxn][2];
int n, t = 0;

int main(int argc, char** argv)
{
    scanf("%s%d", str + 1, &t);
    n = strlen(str + 1);
    // Set initial X/Y coords
    states[0][0] = 0;
    states[0][1] = 0;
    // Iterating
    for (int i = 1; i <= n; i++) {
        lli dx = states[i - 1][0],
            dy = states[i - 1][1];
        if (str[i] == 'E') dx++;
        else if (str[i] == 'W') dx--;
        else if (str[i] == 'N') dy++;
        else if (str[i] == 'S') dy--;
        states[i][0] = dx;
        states[i][1] = dy;
    }
    lli dx = states[n][0] * int(t / n) + states[t % n][0],
        dy = states[n][1] * int(t / n) + states[t % n][1];
    printf("%lld %lld\n", dx, dy);
    return 0;
}