试题 历届真题 机器人行走(C语言实现)

资源限制

时间限制: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;
}

希望大家多多指教

 

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值