机器人行走

机器人行走
/*
某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。
    例如,我们可以对小车输入如下的指令:
    15L10R5LRR10R20
    则,小车先直行15厘米,左转,再走10厘米,再右转,...
    不难看出,对于此指令串,小车又回到了出发地。
   你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。
【输入、输出格式要求】
    用户先输入一个整数n(n<100),表示接下来将有n条指令。
   接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)
    每条指令的长度不超过256个字符。
    程序则输出n行结果。
    每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。
*/
#include
#include 
using namespace std;
#define N 100   //最多的指令数
#define M 256   //每条指令的字符最多总数
void main()
{
 int num;
 double m=0.00;
 char a[N][M];
 int count[M],q=0,t=0;
 cin>>num;//输入指令条数
 //输入每条指令
 for(int x=0;x<num;x++)
 {
  cin>>a[x];
 }
 //初始化计数器和运算
 for(int y=0;y<num;y++)
 {
  count[y]=0;
  for(int s=0;s<M-1;s++)
  {
   if(a[y][s]!='\0')
    count[y]=count[y]+1;
   else
    break;
  }
 }
//运算距离
 for(int i=0;i<num;i++)
 { 
  //初始化方向
 double b[6][2];
 b[0][0]=0.00;b[0][1]=1.00;//上
 b[1][0]=1.00;b[1][1]=0.00;//右
 b[2][0]=0.00;b[2][1]=-1.00;//下
 b[3][0]=-1.00;b[3][1]=0.00;//左
 b[4][0]=0.00;b[4][1]=0.00;//中间转换暂存
 b[5][0]=0.00;b[5][1]=0.00;//最终坐标存储
 //运算终结点坐标
  for(int j=0;j<count[i]+1;j++)
  {
   if(a[i][j]=='R'||a[i][j]=='L'||a[i][j]=='\0')
   {
    if(a[i][j-1]>='0'&&a[i][j-1]<='9')
    {
     m=(int)a[i][j-1]-48;
     if(a[i][j-2]>='0'&&a[i][j-2]<='9')
     {
      m+=((int)a[i][j-2]-48)*10;
      if(a[i][j-3]>'0'&&a[i][j-3]<='9')
      {
       m+=((int)a[i][j-3]-48)*100;
      }
     }
     b[5][0]+=b[0][0]*m;
     b[5][1]+=b[0][1]*m;
    }
   }
  //转换方向
   if(a[i][j]=='R')
   {
    b[4][0]=b[0][0];b[4][1]=b[0][1];
    b[0][0]=b[1][0];b[0][1]=b[1][1];
    b[1][0]=b[2][0];b[1][1]=b[2][1];
    b[2][0]=b[3][0];b[2][1]=b[3][1];
    b[3][0]=b[4][0];b[3][1]=b[4][1];
    b[4][0]=0;b[4][1]=0;
   }
   if(a[i][j]=='L')
   {
    b[4][0]=b[0][0];b[4][1]=b[0][1];
    b[0][0]=b[3][0];b[0][1]=b[3][1];
    b[3][0]=b[2][0];b[3][1]=b[2][1];
    b[2][0]=b[1][0];b[2][1]=b[1][1];
    b[1][0]=b[4][0];b[1][1]=b[4][1];
    b[4][0]=0;b[4][1]=0;
   }
  }
  printf("%.2f",sqrt(b[5][0]*b[5][0]+b[5][1]*b[5][1]));
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值