找到适当和正确目的地的算法

时间:2016-05-26 17:19:47

标签: java algorithm graph-algorithm

  

机器人落在火星上,恰好是笛卡尔网格;假设我们将机器人交给这些指令,       例如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/

3 个答案:

答案 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 = 33 % 4 = 3,它给出了最后一组方向。

希望它有所帮助,你现在了解逻辑。

答案 2 :(得分:0)

超级酷帅,根据我的观点,您的逻辑是正确的,我测试了您的代码,发现了一些错误,您的字符串 d 需要转换数组在循环之前*

  

in.nextLine()。toCharArray()

*;字符串d将为 char [] d 。我的打印输出也已更改

  

(“ [[” + coords [0] +“,” + coords [1] +“]”)

。这是我做的完整代码。之后它就可以了