2016-01-07 3 views
0

У меня есть проблема, когда ему нужно перемещаться по пауку в сетке (координата X, Y) с соответствующей инструкцией. Первоначально паук находится в (0,0) и обращен к положительной оси Y.Как перемещаться по пауку в сетке?

Существует 3 возможных инструкций для навигации: «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)); 
} 

Однако код чувствует себя довольно некрасиво даже для меня. Как я могу лучше разработать алгоритм?

+1

Я голосую, чтобы закрыть этот вопрос не по теме, потому что она принадлежит http://codereview.stackexchange.com/ – Paul

ответ

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

Хммм .... Оба +90? – Andreas

+0

Конечно нет :) Исправлено: –

+0

В решении может быть мало ошибок, скажем, если я передаю «FFLLFFFRFF» \t, результат должен быть [-2, -1]. Вместо этого я получаю [-2, 0] – Arefe

1

Вот как я подхожу к нему.

  1. имеет направление переменного spider_dir (где ваш паук собирается идти). Он будет хранить 4 разных типа значений (например, U, R, D, L).

  2. Имейте функцию change_direction, которая принимает текущее направление и значение L или R и возвращает новое направление. Обратите внимание, что если L передано, вам нужно взять предыдущее круговое значение в массиве значений (['U', 'R', 'D', 'L']) вашего предыдущего значения. Если R, чем следующее круговое значение.

  3. Имейте хэш, который отображает ваше направление к вашим шагам (предположим + x, + y). U будет (0, 1), L будет (-1, 0).

Теперь, когда у вас есть это просто итерацию через строку, и если вы видите F шаг добавить значение текущей позиции в зависимости от вашего spider_dir. Если вы видите что-нибудь другое - изменить свой spider_dir в зависимости от того, где поворачивать и spider_dir

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); 
} 
+0

Это еще один отличный ответ, и я также понимаю это лучше. – Arefe

Смежные вопросы