机器人行走

 

【编程题】(满分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

 

package 简单练习;

import java.util.Scanner;

public class 机器人行走 {

	/**
	 * @param args
	 */
	static int[][] d={{0,1},{1,0},{0,-1},{-1,0}};
	static int dir=0;
	static double x=0,y=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s="";
		Scanner sc=new Scanner(System.in);
		int n=Integer.parseInt(sc.nextLine());
		String[] ss=new String[n];
		for(int i=0;i<n;i++){
			ss[i]=sc.nextLine();
			
		}
		for(int j=0;j<n;j++){
			ss[j]=0+ss[j];
			if(!Character.isDigit(ss[j].charAt(ss[j].length()-1))){
				ss[j]+=0;
			}
			String data[]=ss[j].split("\\D+");
			String fanx[]=ss[j].split("\\d+");
			   x=d[dir][0]*Integer.parseInt(data[0]);
	    	   y=d[dir][1]*Integer.parseInt(data[0]);
	    	  // System.out.println(data.length+","+fanx.length);
	       for(int i=1;i<data.length;i++){
	    	   dir=dfdir(fanx[i]);
	    	   x+=d[dir][0]*Integer.parseInt(data[i]);
	    	   y+=d[dir][1]*Integer.parseInt(data[i]);
	       }
	       System.out.printf("%.2f\n",Math.sqrt(x*x+y*y) );
		}
	}
	private static int dfdir(String str) {
		// TODO Auto-generated method stub
      for(int i=0;i<str.length();i++){
    	  if(str.charAt(i)=='r')dir++;
    	  if(str.charAt(i)=='l')dir=dir+4-1;;
      }
		return dir%4;
	}
 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值