第一次发表博客,不喜勿喷,如有不足或错误,欢迎指出。
下面是这道笔试题:
假设我们是中国国家航天局人员,当玉兔号离开嫦娥三号之后,我们需要能够控制玉兔号在月球上开展探测工作。我们先假定虹湾区是一个很大的平原,我们在虹湾区建立一个坐标轴,如下图(附件):
玉兔号离开嫦娥三号后,根据自身安装的定位系统可以知道自己的初始位置,我们记为 X0 , Y0 ; 同时玉兔号也可以知道当前它的朝向,如东、西、南、北(暂时只考虑这四个方向)。
中国国家航天局会向玉兔号发送指令,我们先暂定为3种:
1. F : 当玉兔号接收到这条指令之后,会向前移动一个坐标单位的距离
2. L : 当玉兔号接受到这条指令之后,会原地向左旋转90度
3. R : 当玉兔号接收到这条指令之后,会原地向右旋转90度
要求:
一:设计一个玉兔号的主程序,能够接收中国国家航天局发送过来的指令序列(如FFLFRFLL),执行该指令序列之后,玉兔号能够走到正确的位置,并知道当前正确的位置。(如:玉兔号初始位置为 (0,0),方向朝东,执行指令 FFLFRFLL之后,位置为 (3,1) 方向朝西)。
二:主程序中,不允许出现switch case语句,也不允许出现else关键字,也不允许使用三元表达式,if关键字出现的次数要求在5次以下(0-4次)。
下面是我的解决方案:
import java.util.Scanner;
public class Template {
public static Scanner in = new Scanner(System.in);
// 0:X轴,1:Y轴
public int $xy = 0;
// 0:正方向,1:负方向
public int $JJ = 0;
// $x:x坐标,$y:y坐标
public int $x = 0, $y = 0;
// 方向
public String orientation = "东";
public boolean X_jia() {
$x += 1;
return true;
}
public boolean X_jian() {
$x -= 1;
return true;
}
public boolean Y_jia() {
$y += 1;
return true;
}
public boolean Y_jian() {
$y -= 1;
return true;
}
public boolean setToX_jia() {
$xy = 0;
$JJ = 0;
orientation = "东";
return true;
}
public boolean setToX_jian() {
$xy = 0;
$JJ = 1;
orientation = "西";
return true;
}
public boolean setToY_jia() {
$xy = 1;
$JJ = 0;
orientation = "北";
return true;
}
public boolean setToY_jian() {
$xy = 1;
$JJ = 1;
orientation = "南";
return true;
}
public void execute() {
System.out.println("请输入指令(F/L/R):");
String cmd = in.nextLine();
char[] cmds = cmd.toCharArray();
for (char c : cmds) {
if ( (c == 'F' && $xy == 0 && $JJ == 0 && X_jia() )
|| (c == 'F' && $xy == 1 && $JJ == 0 && Y_jia() )
|| (c == 'F' && $xy == 0 && $JJ == 1 && X_jian())
|| (c == 'F' && $xy == 1 && $JJ == 1 && Y_jian())
|| (c == 'R' && $xy == 0 && $JJ == 0 && setToY_jian())
|| (c == 'R' && $xy == 1 && $JJ == 0 && setToX_jia() )
|| (c == 'R' && $xy == 0 && $JJ == 1 && setToY_jia() )
|| (c == 'R' && $xy == 1 && $JJ == 1 && setToX_jian())
|| (c == 'L' && $xy == 0 && $JJ == 0 && setToY_jia() )
|| (c == 'L' && $xy == 1 && $JJ == 0 && setToX_jian())
|| (c == 'L' && $xy == 0 && $JJ == 1 && setToY_jian())
|| (c == 'L' && $xy == 1 && $JJ == 1 && setToX_jia())) {
}
}
System.out.println("坐标:(" + $x + "," + $y + ")");
System.out.println("方向:" + orientation);
}
public static void main(String[] args) {
new Template().execute();
}
}
有的人看到if的条件里面这么多逻辑运算符可能就眼花了,其实这里是利用boolean类型和逻辑运算符来实现运算和判断的,这里外层的逻辑或‘||’是衔接每种可能出现的情况,因为逻辑运算符都有短路的情况,逻辑或‘||’是条件一旦符合了就不再继续判断同层的条件,可以理解为一个括号内的条件,所以内层用的是逻辑与‘&&’运算符,每一种情况必须满足括号内的所有条件才能使得这种情况成立,然后整个判断将是返回true。这样运算完全满足题意,当然也会有点难读懂。这段代码也有很多地方没处理,主要是写了这个逻辑过程,请不要在意这些细节。