题干:
NASA派出的一个机器小车已经成功着陆火星。小车面前的是一个十分规矩的矩形平原,操作员需要通过远程发送指令序列来控制这些小车移动,在移动的过程中小车上的高清摄像机会将整个平原的地形完整的记录并送回地球。为了方便导航我们将平原看成一个二维坐标面,x轴正方向为东,y轴正方向为北,矩形平原的最左下角坐标为(0,0)。这样小车的方位便可以使用(X坐标,y坐标,面向方位)来表示,如(0,0,N)表示小车位于平原的左下角并且面向北。操作员可用的指令为L,R和M。L和R可以使小车向左或向右旋转90度而不移动,M可以使小车向所面向的方位前进一格而不改变朝向。你需要编写一个程序来计算小车的最终位置与方位。
小车的坐标:1,2,N ,发出指令:LMLMLMLMM,预期结果:1,3,N
小车的坐标:3,3,E ,发出指令:MMRMMRMRRM,预期结果:5,1,E
代码:
//小车移动
@org.junit.Test
public void test6() {
Scanner sc = new Scanner(System.in);
int nowDir=0;//小车当前朝向,0-北,1-东,2-南,3-西,通过++或--来改变朝向
int x,y;//小车坐标
String beginDir="";//小车初始朝向
String endDir="";//小车最终朝向
while (true) {
//输入小车坐标
System.out.println("请输入小车初始位置");
System.out.print("小车横坐标x:");
x = sc.nextInt();
System.out.print("小车纵坐标y:");
y= sc.nextInt();
//输入小车初始朝向
System.out.print("小车初始朝向(请输入N、E、S、W):");
beginDir =sc.next();
//输入指令
System.out.print("请输入指令:");
String order = sc.next();
//解析初始朝向
switch (beginDir){
case "N":nowDir=0;break;
case "E":nowDir=1;break;
case "S":nowDir=2;break;
case "W":nowDir=3;break;
}
//解析指令
char[] orderChar = order.toCharArray();//把指令转为字符串数组
for (char e : orderChar) {
//解析转向指令L,R
if (e == 'L') {
nowDir--;//向左转90°
if (nowDir < 0) nowDir = 3;//北向左转90°为西
} else if (e == 'R') {
nowDir++;//向右转90°
if (nowDir > 3) nowDir = 0;//西向右转90°为北
} else {
//解析前进指令M
switch (nowDir) {
case 0:
y++;
break;
case 1:
x++;
break;
case 2:
y--;
break;
case 3:
x--;
}
}
}
//将朝向转为大写字母
switch (nowDir){
case 0:endDir = "N";break;
case 1:endDir = "E";break;
case 2:endDir = "S";break;
case 3:endDir = "W";break;
}
System.out.println(x+","+y+","+endDir);
}
}