2012java决赛编程大题

【编程题】(满分18分)

    某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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


【注意】

    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
   
    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
   
    相关的工程文件不要拷入。
   
    请不要使用package语句。
   
    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

 

package common.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/*
 *注意:
 *其实这题关键是要把机器人想象
 *成坐标上的一点,而这一点在某
 *个方向上 x,y变换是不同的,需
 *分情况讨论,注意这一点,这一题
 *也就引刃而解,不显得那么难了!
 */
public class Robot {

  public static void main(String[] args) {

	int x;
	int y;
	String direction;// 初始向右
	List<String> list = new ArrayList<String>();
	Scanner input = new Scanner(System.in);
	int n = input.nextInt();
	for (int i = 0; i < n; i++)
		list.add(input.next());
		for (int j = 0; j < list.size(); j++) {
		x = 0;
		y = 0;
		direction = "right";
		String inputStr = "";
		String newStr = "";
		inputStr = list.get(j);
		 for (int m = 0; m < inputStr.length(); m++) {
			char temp = inputStr.charAt(m);
			 if (m != 0 && (temp == 'L' || temp == 'R')) {
				newStr += "," + temp;
			} else
				newStr += temp;
			}
			String str[] = newStr.split(",");
		   for (int k = 0; k < str.length; k++) {
			String arrayStr = str[k];
			String order = "";// 命令
			int value = 0; // 命令值
			if (arrayStr.length() >= 2
				&& (arrayStr.contains("L") || arrayStr.contains("R"))) {
				order = arrayStr.charAt(0) + "";
				value = Integer.parseInt(arrayStr.substring(1));
				}
			  if (arrayStr.length() == 1 && arrayStr.equals("L"))
				order = "L";
			  if (arrayStr.length() == 1 && arrayStr.equals("R"))
				order = "R";
				if (!arrayStr.contains("L") && !arrayStr.contains("R")) {
				  value = Integer.parseInt(arrayStr);
				  order = "straight";// 一开始直走
				}
				// 一开始向右直走
				if (order.equals("straight")) {
					x += value;
					direction = "right";
				}
				// 方向为右-->向左、向右x,y的变化
				else if (order.equals("R") && direction.equals("right")) {
					y -= value;
					direction = "down";
				} else if (order.equals("L") && direction.equals("right")) {
					y += value;
					direction = "up";
				}
				// 方向向上-->向左、向右x,y的变化
				else if (order.equals("L") && direction.equals("up")) {
					x -= value;
					direction = "left";
				} else if (order.equals("R") && direction.equals("up")) {
					x += value;
					direction = "right";
				}
				// 方向向下-->向左、向右x,y的变化
				else if (order.equals("L") && direction.equals("down")) {
					x += value;
					direction = "right";
				} else if (order.equals("R") && direction.equals("down")) {
					x -= value;
					direction = "left";
				}

				// 方向向左-->向左、向右x,y的变化
				else if (order.equals("L") && direction.equals("left")) {
					y -= value;
					direction = "down";
				} else if (order.equals("R") && direction.equals("left")) {
					y += value;
					direction = "up";
				}
			}
			double result = Math.sqrt(x * x + y * y);
			System.out.printf("%.2f", result);
			System.out.println();
		}
	}

}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值