9.2练习题6 东风谷早苗 题解

题目出处:洛谷 P1724

题目描述

在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女。某一天,早苗终于入手了最新款的钢达姆模型。作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重)。早苗的新模型可以按照输入的命令进行移动,命令包含’E’、’S’、’W’、’N’四种,分别对应四个不同的方向,依次为东、南、西、北。执行某个命令时,它会向着对应方向移动一个单位。作为新型机器人,自然不会只单单执行一个命令,它可以执行命令串。对于输入的命令串,每一秒它会按照命令行动一次。而执行完命令串最后一个命令后,会自动从头开始循环。在0时刻时早苗将钢达姆放置在了(0,0)的位置,并且输入了命令串。她想要知道T秒后钢达姆所在的位置坐标。
向东移动,坐标改变改变为(X+1,Y);
向南移动,坐标改变改变为(X,Y-1);
向西移动,坐标改变改变为(X-1,Y);
向北移动,坐标改变改变为(X,Y+1);

输入格式

第1行:一个字符串,表示早苗输入的命令串,保证至少有1个命令
第2行:一个正整数T
输入数据保证:T <= 2,000,000,000 且命令串长度<= 5,000

输出格式

第1行:两个整数,表示T秒时,钢达姆的坐标

样例输入

NSWWNSNEEWN
12

样例输出

-1 3

题目分析

这道题目是模拟题。
但是是有一丢丢技巧的模拟题。
首先我们一看这个 T 在最坏情况下是 \(2 \times 10^9\) 次方,如果你乖乖地按照题目描述一步一步模拟的话那肯定超时无疑了。
所以说我们要找规律,那么规律在哪里呢?
题目告诉我们指令的长度不超过 \(5000\) ,这就是说我们可以直接根据 \(T / n\) (这里 \(n\) 是指令的长度)求出我可以完整地执行多少轮指令,我们假设 dx 表示完整地执行了一轮指令之后 x 的偏移量, dy 表示完整地执行了一轮指令之后 y 的偏移量。那么在执行了 \((T/n)\) 轮完整地循环后, 她的位置将会变到 \((\frac tn \times dx, \frac tn \times dy)\) 的位置处,然后接下来只剩下了 \(T\ mod\ n\) 次指令没有执行(\(mod\) 表示取模运算,即取余数),这些步数的模拟一可以接受的,所以我们在剩下的步数就可以一步步模拟一下了。
实现的代码如下(使用switch..case语句进行的比较,方便你们查看):

#include <bits/stdc++.h>
using namespace std;
int x,  // x表示最终的横坐标
    y,  // y表示最终的纵坐标
    dx, // dx表示一个周期横坐标的偏移量
    dy, // dy表示一个周期纵坐标的偏移量
    T,  // T表示移动的步数
    n;  // n表示一个周期的步数
string s;   // s表示方向字符串
int main() {
    cin >> s >> T;
    n = s.length();
    for (int i = 0; i < n; i ++) {
        switch(s[i]) {
            case 'E': dx += 1; break;
            case 'S': dy -= 1; break;
            case 'W': dx -= 1; break;
            case 'N': dy += 1; break;
            default: break;
        }
    }
    x = T/n * dx;
    y = T/n * dy;
    T %= n;
    for (int i = 0; i < T; i ++) {
        switch(s[i]) {
            case 'E': x += 1; break;
            case 'S': y -= 1; break;
            case 'W': x -= 1; break;
            case 'N': y += 1; break;
            default: break;
        }
    }
    cout << x << " " << y << endl;
    return 0;
}
posted @ 2019-09-15 20:50  zifeiynoip  阅读(393)  评论(0编辑  收藏  举报