机器人 (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;
}