题目描述: 某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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,y)。然后4个方向,上左下右四个方向分别对应y+距离,x-距离,y-距离,x+距离。最后sqrt(x*x+y*y)得到结果,最后格式化输出保存两位小数【System.out.print("%.2f",结果);】
代码:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class test_2 { public static int x=0; public static int y=0; //处理输入字符串,将不同命令放到List中 public static List<String> dispose(String str){ List<String> list = new ArrayList<String>(); String st = ""; for(int i=0;i<str.length();i++){ if(str.charAt(i)=='L' || str.charAt(i)=='R'){ list.add(""+str.charAt(i)); continue; } if(str.charAt(i)<='9' && str.charAt(i)>='0'){ if(i+1<str.length() && (str.charAt(i+1)<='9' && str.charAt(i+1)>='0')){ st+=""+str.charAt(i); } else{ st+=""+str.charAt(i); list.add(st); st=""; } } } return list; } public static void change(List<String> list){ //1上,2左,3下,4右,默认是向前 int direction = 1; for(String st:list){ if(st.equals("L")){ direction=direction%4+1; }else if(st.equals("R")){ if(direction-1 == 0) direction=4; else direction--; }else{ move(direction,Integer.parseInt(st)); } } } public static void move(int direction,int distance){ switch (direction) { case 1: y+=distance; break; case 2: x-=distance; break; case 3: y-=distance; break; case 4: x+=distance; break; } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); for(int i=0;i<n;i++){ x=0;y=0; String st = scanner.next(); change(dispose(st)); System.out.printf("%.2f",Math.sqrt(x*x+y*y)); } scanner.close(); } }