机器人行走
/*
某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。
某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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 //每条指令的字符最多总数
*/
#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;
}
}
{
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;
}
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]));
}
}
{
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]));
}
}