资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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
思路解析:
设置机器人的起始坐标(0,0)即x=0,y=0;
我们先假设机器人的方向向左
然后呢
向左转:d=(d+1)%4;
向右转:d=(d+3)%4;
至于为什么向右转是d=(d+3)%4,因为本来是要d=(d-1)%4,考虑到d为负数,所以d=(d-1+4)%4,
然后简化成d=(d+3)%4;
关键一步就是走多少步给x还是y;
x+=dire[d][0]*num;
y+=dire[d][1]*num;
代码实现:
#include <stdio.h>
#include <math.h>
int dire[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
char a[300];
int main()
{
//方向标识符
int d=0;
//起始坐标
int x=0,y=0;
//保留坐标的
int x1,y1;
int n;
scanf("%d",&n);
int i,num,k,j;
double distance=0;
while(n--)
{
//保留原始坐标
x1=x;
y1=y;
getchar();
scanf("%s",a);
for(i=0;a[i];)
{
num=0;
if(a[i]!='l'&&a[i]!='r')
{
//求出num且没到字符串最后
while(a[i]!='l'&&a[i]!='r'&&a[i])
{
num=num*10+a[i]-'0';
i++;
}
//用num乘以方向,更新x,y;
x+=dire[d][0]*num;
y+=dire[d][1]*num;
}
//搞方向,直到a[i]不是方向为止
while(a[i]=='l'||a[i]=='r')
{
d=a[i]=='l'?(d+1)%4:(d+3)%4;
i++;
}
}
//用勾股定理求距离
k=pow(abs(x-x1),2);
j=pow(abs(y-y1),2);
distance=sqrt(k+j);
//输出
printf("%0.2f\n",distance);
}
return 0;
}
希望大家多多指教