机器人行走问题

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


package part2;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Scanner;

public class Test14 {
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		System.out.println("输入要输入的指令数:");
		int n = scan.nextInt();
		scan.nextLine();
		String[] ss = new String[n];
		System.out.println("请输入要输入的"+n+"条指令:");
		for(int i=0;i<n;i++)
			ss[i] = scan.nextLine();
		for(int i=0;i<n;i++){
			int x,y;						//定义x,y,记录机器人的坐标,
			x=y=0;
			double dis = 0.0;					//最终机器人到原点的距离
			ArrayList<Character> al = new ArrayList<Character>();
			al.add('S');						//用集合模拟东西南北,二维坐标系。
			al.add('W');
			al.add('N');
			al.add('E');
			for(int j=0;j<ss[i].length();j++){			//L100R50R10
				if(ss[i].charAt(j)=='L'){			//向左转,
					al.add(al.remove(0));
					continue;
				}
				if(ss[i].charAt(j)=='R'){			//向右转
					al.add(0,al.remove(3));
					continue;
				}
				int a = 0;
				String s = "";
				System.out.println(s);
				while(ss[i].charAt(j+a)>='0'&&ss[i].charAt(j+a)<='9'&&j+a<ss[i].length()){	//取出数字部分。
					s+=ss[i].charAt(j+a);
					a++;
				}
				j = j+a-1;//改变增量j
				int b = Integer.parseInt(s);			//把本次走的路程变成int型
				if((char)al.get(0)=='S')			//横纵坐标的加减
					y += b;
				else if((char)al.get(0)=='W')
					x -= b;
				else if((char)al.get(0)=='N')
					y -= b;
				else if((char)al.get(0)=='E')
					x += b;
			}
			//格式化数据
			DecimalFormat formater = new DecimalFormat("#0.##");
			dis = Math.sqrt(Math.pow(Math.abs(x),2)+Math.pow(Math.abs(y),2));
			dis = Double.parseDouble(formater.format(dis));
			System.out.println(dis);
		}
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值