我有一个问题,它需要用正确的指令在网格系统(X,Y坐标)中导航蜘蛛。最初,蜘蛛位于(0,0)并面向正Y轴。
导航有三种可能的说明:' F'对于前锋(同一方向1格),' R'右转(90度)和' L'对于左转(90度)并且最初,蜘蛛面向正Y轴。
说,如果我传递" LFF"的方向字符串,则位置应为(-2,0)。我解决了问题,代码的当前状态如下,
public static void spiderNavigator(String str ){
if( str == null || str.length() == 0)
return;
int [] initial = {0,0};
boolean xPos = false, xNeg = false, yPos = true, yNeg = false;
char[] ch = str.toCharArray();
for( char c: ch){
// the initial position of the spider is towards the positive Y axis
if(c == 'L'){
if(xPos){
xPos = false;
yPos = true;
}
else if ( xNeg){
xNeg = false;
yNeg = true;
}
else if(yPos){
xNeg = true;
yPos = false;
}
else if (yNeg){
yNeg = false;
xPos = true;
}
}
else if ( c == 'R'){
if(xPos){
xPos = false;
yNeg = true;
}
else if ( xNeg){
yPos = true;
xNeg = false;
}
else if(yPos){
yPos = false;
xPos = true;
}
else if (yNeg){
yNeg = false;
xNeg = true;
}
}
else if (c == 'F'){
if(xNeg){
initial[0] -= 1;
}
else if (xPos){
initial[0] += 1;
}
else if (yNeg){
initial[1] -=1;
}
else if( yPos){
initial[1] += 1;
}
}
}
System.out.println(Arrays.toString(initial));
}
但是,即使对我来说代码也很难看。如何以更好的方式设计算法?
答案 0 :(得分:4)
这是一个更短更优雅的解决方案:
public static void spiderNavigator(String str) {
if (str == null || str.length() == 0)
return;
int[] initial = {0, 0};
int angle = 90;
char[] ch = str.toCharArray();
for (char c : ch) {
if (c == 'L') {
angle = (angle + 90) % 360;
} else if (c == 'R') {
angle = (angle - 90) % 360;
} else if (c == 'F') {
initial[0] += (int) Math.cos(Math.toRadians(angle));
initial[1] += (int) Math.sin(Math.toRadians(angle));
}
}
System.out.println(Arrays.toString(initial));
}
角度代表蜘蛛面向的方向,使用三角函数,您可以根据当前位置和它所面对的角度轻松计算它应该移动的位置。
答案 1 :(得分:1)
以下是我接近它的方法。
有一个方向变量spider_dir
(你的蜘蛛现在要去哪里)。它将存储4种不同类型的值(例如U
,R
,D
,L
)。
有一个函数change_direction
,它取一个当前方向a并且值为L
或R
并返回一个新方向。请注意,如果传递L
,则需要在先前值的值数组(['U', 'R', 'D', 'L']
)中获取先前的循环值。如果R
比下一个循环值。
使用哈希将您的方向映射到您的步骤(假设+ x,+ y)。 U
为(0, 1)
,L
为(-1, 0)
。
现在您只需遍历字符串即可,如果您看到F
移动,则根据您的spider_dir
将值添加到当前位置。如果您看到其他任何内容 - 请根据转动的位置和spider_dir
spider_dir
答案 2 :(得分:1)
这是一个基于与@MateuszDryzek非常好的答案类似概念的版本,但没有使用三角函数。
public static void spiderNavigator(String str) {
if (str == null || str.isEmpty())
return;
int x = 0, y = 0, dir = 0;
for (char c : str.toCharArray())
if (c == 'R')
dir = (dir + 1) % 4; // dir++: 0 -> 1 -> 2 -> 3 -> 0
else if (c == 'L')
dir = (dir + 3) % 4; // dir--: 3 -> 2 -> 1 -> 0 -> 3
else if (c == 'F')
if (dir == 0)
y++; // 0: Up
else if (dir == 1)
x++; // 1: Right
else if (dir == 2)
y--; // 2: Down
else
x--; // 3: Left
System.out.printf("(%d,%d)%n", x, y);
}