机器人落在火星上,恰好是笛卡尔网格;假设我们将机器人交给这些指令, 例如LFFFRFFFRRFFF,其中" L"是"左转90度"," R"是"右转90度"和" F"是"前进一个空间, 请为机器人编写控制代码,使其最终到达适当且正确的目的地,并包括单元测试。
以下是使用命令" FF":
的示例输出[0, 2]
我可以在Google上找到解决此问题的方法,但我对解释并不十分清楚。我试图清楚地理解如何解决这个问题并在Java中实现的逻辑。任何帮助表示赞赏。
更新:这是一个面试问题。现在,我正努力提高自己的知识水平。这对我来说很有意思。如果我打破任何堆叠超过规则,我可以删除。
以下是我所做的研究: Is there an equivalent of Scala's Either in Java 8?
Algorithm for finding all paths in a NxN grid
http://www.geeksforgeeks.org/check-if-a-given-sequence-of-moves-for-a-robot-is-circular-or-not/
答案 0 :(得分:1)
import java.util.Scanner;
public class Run{
public static void main(String []args){
int angle = 0, c = 0;
int[] coords = {0,0};
String d;
Scanner in = new Scanner(System.in);
System.out.println("Input your command");
d = in.nextLine();
for (c = 0; c < d.length; c++){
if (d[c] == 'R'){
angle = (angle + 90)%360;
}else if (d[c] == 'L'){
angle = (angle + 270)%360;
}else if (d[c] == 'F'){
switch(angle){
case 0: coords[1]++;break;
case 90: coords[0]++;break;
case 180: coords[1]--;break;
case 270: coords[0]--;
}
}
}
System.out.println('['+coords[0]+','+coords[1]+']');
}
}
我认为这段代码很简单。 目前我没有Java环境,所以我无法测试它。如果我错了,请纠正我
答案 1 :(得分:1)
我为您准备了以下代码:
public static String calculate(String str) {
int x = 0;
int y = 0;
int[][] move = {{0,1}, {1,0}, {-1,0}, {0,-1}};
int dir = 0;
for (char ch: str.toCharArray()) {
if (ch == 'F') {
x += move[dir][0];
y += move[dir][1];
} else if (ch == 'L') {
dir++;
} else if (ch == 'R') {
dir--;
}
dir = (dir + 4) % 4;
}
return "[" + x + ", " + y + "]";
}
让我们分析一下我天真的解决方案。
int[][] move = {{0,1}, {1,0}, {-1,0}, {0,-1}};
是您使用变量dir
向左旋转时的所有移动组合。String str
以获取每个命令F
,请向dir
方向移动。子阵列用于轴。dir
以获得正确的结果。dir
不会溢出dir = (dir + 4) % 4;
。这意味着当我向下移动dir = 0
并向左移动(dir--
)时,它将导致dir=-1
,这是非法的。所以dir + 4 = 3
和3 % 4 = 3
,它给出了最后一组方向。希望它有所帮助,你现在了解逻辑。
答案 2 :(得分:0)
超级酷帅,根据我的观点,您的逻辑是正确的,我测试了您的代码,发现了一些错误,您的字符串 d 需要转换数组在循环之前*
in.nextLine()。toCharArray()
*;字符串d将为 char [] d 。我的打印输出也已更改
(“ [[” + coords [0] +“,” + coords [1] +“]”)
。这是我做的完整代码。之后它就可以了