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 }

浙公网安备 33010602011771号