蓝桥杯——机器人行走
某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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.ArrayList; import java.util.Scanner; public class 机器人行走 { /** * @param args */ //初始朝向 static int fang=1; //初始坐标 static int x=0,y=0; //定义方向 static int[][]ss={{0,1},{1,0},{0,-1},{-1,0}}; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); String[]list=new String[n]; for (int i = 0; i <n; i++) list[i]=scanner.next(); for (String string : list) { Get(string); x=0; y=0; } } public static void Get(String str) { ArrayList<String>list=new ArrayList<String>(); //将字符与数字分开 String temp1="";//零时存储数字 String temp2="";//零时存储字符 for (int i = 0; i < str.length(); i++) { //如果当前获取的字符属于数字,则并入 temp1 if(str.charAt(i)>='0'&&str.charAt(i)<='9') { temp1+=str.charAt(i)+""; if(i==str.length()-1) list.add(temp1); } //如果当前获取的字符不属于数字 else{ //判断存储数字的 temp1 是否属于空 if(temp1!=""){ list.add(temp1); temp1=""; } temp2=str.charAt(i)+""; list.add(temp2); } } //遍历区分开来的队列 for (String s : list) { //如果不是方向键 则按照当前方向前进 if(!s.equals("R")&&!s.equals("L")) { int t=Integer.parseInt(s); run(t); } else{ //如果是方向键则进行转向 turn(s); } } //利用直角三角形的定理 算出长边的长度 double sum=Math.sqrt(Math.pow(x,2)+Math.pow(y,2)); System.out.printf("%.2f",sum); System.out.println(); } //n 前进的距离 static void run(int n) { x+=ss[fang][0]*n; y+=ss[fang][1]*n; } //转弯 static void turn(String st) { //如果是右方(顺时针)则加一并取模4的值 if(st.equals("R")){ fang=(fang+1)%4; } //如果是左方(顺时针)则加3并取模4的值 else{ fang=(fang+3)%4; } } }
原文链接:https://blog.csdn.net/qq_39020387/article/details/79739814