蓝桥杯 机器人行走 模拟 类


    某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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

【注意】


    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!


模拟小车的行走,初始的时候车头应该是朝前(U)的,然后根据L和R的数量不同,分别会朝向后(D),左(L),右(R),还要存储小车的当前坐标和上一步的坐标,这么多参数都是与小车有关,不难想到通过创建一个Car类来将这么多数据封装起来,使代码更加有条理,然后通过在类内部写一些函数来完成相应的功能,比如转向,前进,计算距离等,在调试的时候还会用到显示坐标等函数。主函数中首先当然是输入指令,在分析指令的时候,我才用的是逐个字符分析,即从第一个字符开始遍历,当遇到字母的时候,就调用转向函数,当遇到数字的时候,就将这个数字串读取出来,转换成真正的数字,调用前进函数,当一条指令读取完成之后,就调用计算函数计算出距离,不要忘了结果保留两位小数。

#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
using namespace std;

class Car
{
	public:
		Car()
		{
			x=pre_x=0;
			y=pre_y=0;
			dir='U';
		}
		void changeDir(char d)
		{
			if(d=='L')
			{
				if(dir=='U')
				dir='L';
				else if(dir=='L')
				dir='D';
				else if(dir=='D')
				dir='R';
				else if(dir=='R')
				dir='U';
			}
			if(d=='R')
			{
				if(dir=='U')
				dir='R';
				else if(dir=='R')
				dir='D';
				else if(dir=='D')
				dir='L';
				else if(dir=='L')
				dir='U';
			}
		}
		void run(int dis)
		{
			if(dir=='U')
			y+=dis;
			else if(dir=='D')
			y-=dis;
			else if(dir=='L')
			x-=dis;
			else if(dir=='R')
			x+=dis;
		}
		double calDis()
		{
			double dis=sqrt(pow(x-pre_x,2)+pow(y-pre_y,2));
			pre_x=x;
			pre_y=y;
			return dis;
		}
		void show_pos()
		{
			cout<<x<<' '<<y<<endl;
			cout<<pre_x<<' '<<pre_y<<endl; 
		}
	private:
		int x,pre_x;
		int y,pre_y;
		char dir;
		
};


int main()
{
	int n,i,j,k,len,p,dis;
	char num[3];
	Car car;
	cin>>n;
	for(i=0;i<n;i++)
	{
		char order[260];
		cin>>order;
		len=strlen(order);
		for(j=0;j<len;j++)
		{
			if(order[j]>='0'&&order[j]<='9')
			{
				p=0;
				dis=0;
				for(;order[j]>='0'&&order[j]<='9';j++)
				{
					num[p++]=order[j];
					//cout<<num[p-1];
				}
				//cout<<endl;
				for(k=p-1;k>=0;k--)
				{
					dis+=(int)(num[k]-'0')*pow(10.0,p-k-1);
					//cout<<dis<<endl;
				}
				car.run(dis);
			}
			if(order[j]>='A'&&order[j]<='Z')
			{
				car.changeDir(order[j]);
			}
		}
		//car.show_pos();
		cout<<fixed<<setprecision(2)<<car.calDis()<<endl;
	}
	return 0;
}


    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值