某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。
例如,我们可以对小车输入如下的指令:
15L10R5LRR10R20
则,小车先直行15厘米,左转,再走10厘米,再右转,...不难看出,对于此指令串,小车又回到了出发地。
你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。
【输入、输出格式要求】
用户先输入一个整数n(n<100),表示接下来将有n条指令。接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)每条指令的长度不超过256个字符。
程序则输出n行结果。
每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。
例如:用户输入:
5
L100R50R10
3LLL5RR4L12
LL
100R
5L5L5L5
则程序输出:
102.96
9.06
0.00
100.00
0.00
【注意】
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
void TheResult(char* arg); //通过检测输入计算距离的函数
void Go(int num); //机器人行走的函数
void Clean(); //初始化静态变量的函数
static int ahead = 0; //方向标(有0,1,2,3四种情况,分别代表不同方向)
static int x = 0; //X轴坐标
static int y = 0; //Y轴坐标
int main(){
int time;
char strKey[256];
cin >> time;
for (int i = 0; i < time; i++){
cin >> strKey;
TheResult(strKey);
}
return 0;
}
void TheResult(char* arg){
char num[3];
int n;
int some = 0;
for (int i = 0; i < strlen(arg); i++){
if (isdigit(arg[i])){
num[some++] = arg[i];
}
else{
if (some>0){ //如果辅助数组不为空则调用G0行走函数是机器人行走
n = atoi(num);
Go(n);
some = 0;
for (int ii = 0; ii < 3; ii++)
num[ii] = NULL;
}
if ('R' == arg[i]){ //通过检测相应的输入来改变机器人方向
if (ahead < 3)
ahead++;
else
ahead = 0;
}
else if ('L' == arg[i]){
if (ahead>0)
ahead--;
else
ahead = 3;
}
}
}
if (some>0){ //检测所有的移动指令是否都已执行,就本题而言如果最后输入的是方向指令,大可不管
n = atoi(num);
Go(n);
some = 0;
for (int ii = 0; ii < 3; ii++)
num[ii] = NULL;
}
cout << sqrt((pow(x, 2) + pow(y, 2)))<<endl;//利用勾股定理计算并输出结果
Clean(); //重新初始化所有静态变量
}
void Go(int num){
switch (ahead)
{
case 0:
y += num;
break;
case 1:
x += num;
break;
case 2:
y -= num;
break;
case 3:
x -= num;
break;
default:
break;
}
}
void Clean(){
x = 0;
y = 0;
ahead = 0;
}