如何在网格系统中导航蜘蛛?

时间:2016-01-07 01:41:11

标签: java algorithm

我有一个问题,它需要用正确的指令在网格系统(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));
}

但是,即使对我来说代码也很难看。如何以更好的方式设计算法?

3 个答案:

答案 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)

以下是我接近它的方法。

  1. 有一个方向变量spider_dir(你的蜘蛛现在要去哪里)。它将存储4种不同类型的值(例如URDL)。

  2. 有一个函数change_direction,它取一个当前方向a并且值为LR并返回一个新方向。请注意,如果传递L,则需要在先前值的值数组(['U', 'R', 'D', 'L'])中获取先前的循环值。如果R比下一个循环值。

  3. 使用哈希将您的方向映射到您的步骤(假设+ x,+ y)。 U(0, 1)L(-1, 0)

  4. 现在您只需遍历字符串即可,如果您看到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);
}