资源限制
时间限制: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,y)。
既然是点到点的距离,那我们肯定要求移动后小车的坐标(x,y),我们可以用一个变量标识小车的方向
int k = 0;//最初的方向
然后根据方向确定小车移动时对应的(x,y)的加或减,进而求出小车的坐标(x,y)
我这里用了一个数组确定x、y是加还是减
int move[4] = {1, 1, -1, -1};//方向,0/1/2/3分别代表上右下左,接收方向时左减右加
具体咋淦看代码就完了
完整代码如下
#include<iostream>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
int main()
{
int move[4] = {1, 1, -1, -1};//方向,0/1/2/3分别代表上右下左,接收方向时左减右加
int n;
cin >> n;
float end[n] = {0};//存储每一条指令执行后,移动前后的距离
for (int i = 0; i < n;i++)
{
int x = 0, y = 0;//移动前的位置
int k = 0;//最初的方向
string order;//存储每一条指令
cin >> order;
int Max = order.size();
for (int j = 0; j<Max;j++)
{
if(order[j]=='L'||order[j]=='R')//当前位置输入的是方向
{
if(order[j]=='R')//右转
k = (k + 1) % 4;
else//左转
k = k == 0 ? 3 : k - 1;
}
else
{
int dis = 0;//移动距离
int i;
for (i = j; order[i] >= '0' && order[i] <= '9';i++)//这个循环用来求出每个直线移动的距离
{
dis = dis * 10 + (order[i] - '0');
}
j = i-1;//上面for循环语句三有个j++,所以这里要减一,不然会跳过符号
if(k%2)//当前方向在x轴上
{
x += dis * move[k];
}
else//当前方向在y轴上
{
y += dis * move[k];
}
}
}
end[i]= sqrt(pow(x, 2) + pow(y, 2));//保存距离
}
for (int i = 0; i < n;i++)
{
printf("%.2f\n", end[i]);
}
system("pause");
return 0;
}
我表达的可能有点问题,凑活着看看就成 。
兄弟们一起卷,淦就完了。