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

/*机器人行走
 * 【编程题】(满分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
 */
import java.util.Scanner;

public class Demo02 {
	static int direction = 1;
	// direction的值 左为0,上为1,右为2,下为3
	static 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,下为3
			direction = (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点与原点的距离,并输出
		}
	}
}
运行结果:
5
L100R50R10
3LLL5RR4L12
LL
100R
5L5L5L5
102.96
9.06
0.00
100.00
0.00

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值