zoukankan      html  css  js  c++  java
  • 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 imes 10^9) 次方,如果你乖乖地按照题目描述一步一步模拟的话那肯定超时无疑了。
    所以说我们要找规律,那么规律在哪里呢?
    题目告诉我们指令的长度不超过 (5000) ,这就是说我们可以直接根据 (T / n) (这里 (n) 是指令的长度)求出我可以完整地执行多少轮指令,我们假设 dx 表示完整地执行了一轮指令之后 x 的偏移量, dy 表示完整地执行了一轮指令之后 y 的偏移量。那么在执行了 ((T/n)) 轮完整地循环后, 她的位置将会变到 ((frac tn imes dx, frac tn imes 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;
    }
    
  • 相关阅读:
    多列布局之等分布局
    布局之不定宽与自适应
    多列布局之一列、多列定宽及一列自适应布局
    居中布局之水平垂直布局
    JQuery 学习记录
    初遇GitHub
    关于JS中的函数定义及函数表达式
    类型识别
    页面制作(PS/HTML/CSS)易错点总结
    工欲善其事必先利其器系列之:更换Visual Studio代码风格.
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11524153.html
Copyright © 2011-2022 走看看