NOIP模拟赛 机器人(robot)

Problem 1 机器人(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<=500,000 且命令串长度<=5,000

对于100%的数据 T<=2,000,000,000 且命令串长度<=5,000

 

【注意】

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

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

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

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

 

一道简单的模拟题,只有东南西北四个方向。

但是T的数据比较大,直接循环会时间超限,经过对题目的理解不难发现,只有一个相同的字符串来当作行走命令,所以只需要走一遍,然后$MOD$就行。

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 typedef long long ll;
 5 
 6 char str[5010];
 7 ll t;
 8 ll len, o_x, o_y, n;
 9 
10 int main()
11 {
12 //    freopen("robot.in","r",stdin);
13 //    freopen("robot.out","w",stdout);
14     scanf("%s%lld", str + 1, &t);
15     len = strlen(str + 1);
16     ll x = 0, y = 0;
17     for(int i = 1; i <= len; i++)
18     {
19         if(str[i] == 'S') y--;
20         else if(str[i] == 'N') y++;
21         else if(str[i] == 'E') x++;
22         else x--;
23     }
24     o_x = x;
25     o_y = y;
26     n = t / len;
27     t %= len;
28     for(int i = 2; i <= n; i++)
29     {
30         x += o_x;
31         y += o_y;
32     }
33     for(int i = 1; i <= t; i++)
34     {
35         if(str[i] == 'S') y--;
36         else if(str[i] == 'N') y++;
37         else if(str[i] == 'E') x++;
38         else x--;
39     }
40     printf("%lld %lld", x, y);
41 }

 

posted @ 2017-09-10 09:57  Y_sofun  阅读(672)  评论(0)    收藏  举报