某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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
import java.util.LinkedList;
import java.util.Scanner;
public class 机器人行走 {
/**
* @param args
*/
static int ff=0;//初始朝向
static int x1=0;//初始坐标
static int y1=0;
// 上 右 下 左
static int dir[][]={{0,1},{1,0},{0,-1},{-1,0}};
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String ss[]=new String[n];
for (int i = 0; i < ss.length; i++) {
ss[i]=sc.next();
}
for (int i = 0; i < ss.length; i++) {
getResult(ss[i]);
ff=0;
x1=0;
y1=0;
}
}
private static void getResult(String str) {
LinkedList<String> list=new LinkedList<String>();
//将数字和字母分开
String temp="";//临时存储数字
String temp2="";//临时存储字母
for (int i = 0; i < str.length(); i++) {
if(str.charAt(i)>='0' && str.charAt(i)<='9'){
temp+=str.charAt(i)+"";
if(i==str.length()-1){
list.add(temp);
}
}else {
if(temp!=""){
list.add(temp);
temp="";
}
temp2=str.charAt(i)+"";
list.add(temp2);
}
}
for (int i = 0; i < list.size(); i++) {
if(!list.get(i).equals("L") && !list.get(i).equals("R")){
int t=Integer.valueOf(list.get(i));//行动距离
run(t,ff);//前进函数
}else {
turn(ff,list.get(i));
}
}
double sum=Math.sqrt(Math.pow(x1,2)+Math.pow(y1,2));
System.out.printf("%.2f",sum);
System.out.println();
}
/**
* 前进方法
* @param t 前进距离
* @param f 当前方向
*/
private static void run(int t, int f) {
//更新方向
x1+=dir[f][0]*t;
y1+=dir[f][1]*t;
}
/**
* 转向方法
* @param f 当前方向
* @param st 向左 或者 向右
*/
private static void turn(int f, String st) {
if(st.equals("R")){
ff=(f+1)%4;
}else {
ff=(f+3)%4;
}
}
}