第三届蓝桥杯软件大赛“机器人行走”参考编程

来源:互联网 发布:夷陵之战 知乎 编辑:程序博客网 时间:2024/05/15 23:43

        程序是自己写的,只是测试的时候第一个指令和给的结果不一样。也不知自己错在哪里了。可是自己手动计算结果和自己的一样。如果有错误希望指出。

程序没有做过多的兼容设置,指令只能认识大写'R'和'L'。思路是将机器人放在直角坐标系上移动的。以转向指令改变方向。思路是先位移后转向。默认第一次方向为X轴正方向。最后的移动轨迹是一个三角形。

        可能我的想法太复杂了,希望有更好的思路可以指导下我。我是Java新手。

 

===============华丽丽的分割线===============

 

我先将原题目贴出来吧:

 

【编程题】(满分18分)

    某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。

    例如,我们可以对小车输入如下的指令:

    15L10R5LRR10R20

    则,小车先直行15厘米,左转,再走10厘米,再右转,...

    不难看出,对于此指令串,小车又回到了出发地。

    你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。

【输入、输出格式要求】

    用户先输入一个整数n(n<100),表示接下来将有n条指令。

    接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)
 
    每条指令的长度不超过256个字符。

    程序则输出n行结果。

    每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。

    例如:用户输入:
5
100L100R50R10
3LLL5RR4L12
LL
100R
5L5L5L5

    则程序输出:
102.96
9.06
0.00
100.00
0.00

 

===============华丽丽的分割线===============

 

/*机器人行走,先位移后转向*/import java.text.DecimalFormat;import java.util.Scanner;public class Num03 {private static Scanner in;private static int coordinate = 1;//标号,一共4个值,标示坐标系上的4个方向。默认开始为1,及Y轴正方向;private static double L = 0, H = 0;//L为三角形长,H为三角形高//指令解析public static double analysis(String order){//初始化全局变量L = 0; H = 0;coordinate = 1;//在指令后面添加一个转向指令,以免丢失最后一个数据,所添加的指令对最后的计算结果无影响StringBuilder e=new StringBuilder(order+"R");//用于截取指令段StringBuilder n=new StringBuilder();//初始化局部变量int dis= 0;char ord;while (e.length()>0){//截取指令段并删除已截取的指令。n.append(e.charAt(0));e = e.deleteCharAt(0);//判断当前截取指令是否满足执行条件  以'R','L'结尾的指令段if (n.charAt(n.length()-1)=='R'||n.charAt(n.length()-1)=='L'){//当截取的指令长度为1的时候,表示当前指令只有转向指令无位移指令,及位移为0 。if(n.length()==1){dis = 0;ord = n.charAt(0) ;count(ord,dis);n.delete(0,n.length());}else{dis = Integer.parseInt(n.substring(0,n.length()-1));ord = n.charAt(n.length()-1);count(ord,dis);n.delete(0,n.length());}}}return calcDis();//返回最后的结果}//计算长,宽public static void count(char ord, int dis){switch (coordinate){//当前方向Y轴正方向case 1 :if (ord == 'L'){H += dis;coordinate = 4;//当前方向为Y轴正方向时,获得L指令,方向改为X轴反方向,及coordinate置为4,以下同理。}else{H += dis;coordinate = 2;}break;//当前方向X轴正方向case 2 :if (ord == 'L'){L += dis;coordinate = 1;}else{L += dis;coordinate = 3;}break;//当前方向Y轴反方向case 3 :if (ord == 'L'){H -= dis;coordinate = 2;}else{H -= dis;coordinate = 4;}break;//当前方向X轴反方向case 4 :if (ord == 'L'){L -= dis;coordinate = 3;}else{L -= dis;coordinate = 1;}break;}}//计算起始距离public static double calcDis(){return Math.sqrt(L*L+H*H);}//启动控制台public static void main(String[] args){in = new Scanner(System.in);String[] ord = new String[in.nextInt()];for (int index = 0;index<ord.length;index++){ord[index] = in.next();}for (int index = 0;index<ord.length;index++){System.out.println(new DecimalFormat("0.00").format(analysis(ord[index])));}}}