机器人行走 某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单, 只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。
/*机器人行走 * 【编程题】(满分18分) 某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单, 只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。 例如,我们可以对小车输入如下的指令: 15L10R5LRR10R20 则,小车先直行15厘米,左转,再走10厘米,再右转,... 不难看出,对于此指令串,小车又回到了出发地。 你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。【输入、输出格式要求】 用户先输入一个整数n(n<100),表示接下来将有n条指令。 接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数) 每条指令的长度不超过256个字符。 程序则输出n行结果。 每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。 例如:用户输入:5L100R50R103LLL5RR4L12LL100R5L5L5L5 则程序输出:102.969.060.00100.000.00 */import java.util.Scanner;public class Demo02 {static int direction = 1;// direction的值 左为0,上为1,右为2,下为3static int[] X = {-1, 0, 1, 0};static int[] Y = { 0, 1, 0, -1};static int x = 0;// 点坐标 x 值 static int y = 0;// 点坐标 y 值// 输入数据public static String[] input(int n){Scanner scan = new Scanner(System.in);String[] ss = new String[n];for(int i=0;i<n;i++){ss[i] = scan.nextLine();}return ss;}// 计算xy坐标值public static void countXY(String ss) {if(!ss.equals("")){int n = Integer.parseInt(ss);x += n * X[direction];y += n * Y[direction];}}// 修改方向(direction)public static void alterDirection(char c){if(c=='L'){// direction的值 左为0,上为1,右为2,下为3direction = (direction+3)%4;}else if(c=='R'){direction = (direction+1)%4;}}// 进入函数操作public static void f(String s){String ss="";// 暂存数字for(int i=0;i<s.length();i++){char c = s.charAt(i);if(c>='0'&&c<='9'){ss += c;// 添加数字}else {countXY(ss);// 计算xy坐标值ss = "";// 清空用过的数字alterDirection(c);// 修改方向(direction)}}countXY(ss);// for 执行完查看暂存数字是否还有数字,有的话计算最后一次坐标ss = "";// 清空用过的数字}// 计算xy点与原点的距离,并输出public static void calc(){System.out.printf("%.2f\n",Math.sqrt(x*x+y*y));x = 0;// 回归原点 为下次计算用y = 0;}public static void main(String[] args){Scanner scan = new Scanner(System.in);String[] s = input(scan.nextInt());// 输入数据for(int i=0;i<s.length;i++){f(s[i]);// 进入函数操作calc();// 计算xy点与原点的距离,并输出}}}运行结果:
5L100R50R103LLL5RR4L12LL100R5L5L5L5102.969.060.00100.000.00