某少年宮引進了一批機器人小車。可以接受預先輸入的指令,按指令行動。小車的基本動作很簡單,隻有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
【注意】
請仔細調試!您的程式隻有能運作出正确結果的時候才有機會得分!
用模拟來完成的,用三個參數來記錄和決定到底要怎麼走,分别是目前的方向、左轉和右轉、前進的步數
挺簡單的并且注釋很全,直接貼碼...
#include <iostream>
#include <cstdio>
#include <cmath>
#include <memory.h>
using namespace std;
int horizontal=0,vertical=0;//分别記錄豎直和水準離開原點的距離
char judge(char now,char lefORrig,int n){//三個變量分别代表着目前的方向,所進行的操作,前進的步數
switch(now){
case 'N':
if(lefORrig=='L') { horizontal-=n; return 'W';}
else { horizontal+=n; return 'E';}
case 'S':
if(lefORrig=='L') { horizontal+=n; return 'E';}
else { horizontal-=n; return 'W';}
case 'W':
if(lefORrig=='L') { vertical-=n; return 'S';}
else { vertical+=n; return 'N';}
case 'E':
if(lefORrig=='L') { vertical+=n; return 'N';}
else { vertical-=n; return 'S';}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
horizontal=0,vertical=0;
string str;
cin>>str;
int len = str.length(), i=0,sum;
char now='N'; //讓機器人開始的方向預設為北方
if(i<len&&str[i]<='9'&&str[i]>='0') //用來處理開始的時候直接出現數字直着走的情況
{
sum = 0;
while(i<len&&str[i]<='9'&&str[i]>='0')sum=(int)(sum*10+str[i++]-'0'); //獲得分離出來的和
vertical+=sum;
}
while(i<len)
{
char tmpch = str[i++];
sum = 0;
while(i<len&&str[i]<='9'&&str[i]>='0') //獲得分離出來的和 如果是連着轉向的話就跳過該步驟,直接記錄下和為0;
sum=(int)(sum*10+str[i++]-'0');
now=judge(now,tmpch,sum);
}
printf("%.2f
",sqrt(horizontal*horizontal+vertical*vertical));
}
return 0;
}