Robot Movement(機器人移動)

中文標題【機器人移動】java

這個題目是 Kayak 發佈的代碼挑戰題目。git

我認爲題目自己描述的不是十分清楚,方法須要返回結果,可是結果沒有說明是機器人最後的座標位置,仍是最後的座標位置距離原點的距離。同時,機器人的初始化方向等都沒有十分明確的定義。github

根據測試數據,機器人應該是從下往上(初始化的方向)。由於若是初始化的方向不肯定的話,最後的座標值可能會不一致。算法

我這裏假設程序應該返回的是機器人的最後座標位置,而且初始化的位置爲 (0,0),方向爲從下往上。數組

英文描述

A robot lands on Mars, which happens to be a cartesian grid; assuming that we hand the robot these instructions, such as LFFFRFFFRRFFF, where "L" is a "turn 90 degrees left", "R" is a "turn 90 degrees right", and "F" is "go forward one space。app

please write control code for the robot such that it ends up at the appropriate-and-correct destination, and include unit tests.測試

Here is an example output with command "FF":spa

[0, 2]翻譯

中文描述

這裏我不按照原文一字一字的翻譯,可是儘可能按照題目的要求把題目解釋清楚。debug

這裏題目的要求是,假設一個機器人降落到火星上了,咱們如今須要給機器人發佈指令。指令包括有 L,R,F 3 個。

L 表示的意思是機器人向左轉 90 度,R 的意思表示的是機器人向右轉 90 度,F 表示的是機器人向前移動一個座標單位。

題目的表達並是是十分明確也清晰,好比說 LFFFRFFFRRFFF 應該返回是什麼沒有說清楚。假設 指令 FF ,返回的結果是 [0, 2],我默認的是程序須要返回機器人最後的座標位置,0 表示的是 X 座標,2 表示的是 Y 座標。

思路和點評

這個問題的思路,首先你須要明白幾個點。若是須要進行座標計算的話,請注意 L 和 F 是不會改變當前機器人的座標位置的。

只有 F 的操做纔會改變機器人的位置。考慮設置一個座標系,那麼這裏須要存儲 2 個信息,第一個信息爲 F 移動時候機器人的位置,另外就是 L 和 F 對機器人方向的控制了。

因此你須要在程序中初始化一個二維數組,這個數組用於存儲 F 操做時候的座標變化。

同時你還須要存儲一個 dir 變量,一般這個變量爲每一次 L 和 R 操做的時候方向的變化。

F 存儲的路徑數組爲:int[][] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };

經過這個數組,你就明白爲何我在這個 WIKI 頁面前面說的,初始化方向很重要,請參考下面的圖(由於不太好用計算機畫圖,咱們用手畫了一個圖)。

在這個圖中比較明確的說明了,咱們定義的初始化方向爲從下往上,Dir 等於 0 。在 Dir 等於 0 的時候座標數組爲 int[][] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; 按照順時針的方向。

在圖中,Dir 有 4 個反向,按照順時針方向,分別爲上,右,下,左,那麼方向對應的值就分別爲 0,1,2,3 。

當方向爲 L 的時候,須要將方向值減 1 ,當方向爲 R 的時候,須要將值 +1。

這裏有個問題爲循環,好比說,方向值爲 RR,,dir 的值應該爲 2。

若是方向爲 RRRRRR,那麼值應該也爲 2。因此在算法中咱們使用了  dir = (dir + 4) % 4;, 對方向進行取 餘數。你能夠看到 當你旋轉 RRRRRR 後,dir 的值仍是爲 2。

針一次轉向 + 移動的操做,無論你轉向多少次,調整的方方向無非就是調整 X 或者 Y 的座標系,在下一次移動的時候應該是 + 仍是 -

因此到這裏方法就相對簡單了。一次移動的時候,都會改變 X 和 Y 座標的值,前提是你是但願怎麼加減而已。

源代碼

源代碼和有關代碼的更新請訪問 GitHub:

https://github.com/cwiki-us/codebank-algorithm/blob/master/src/main/java/com/ossez/codebank/interview/KayakRobotMovement.java

測試類請參考:

https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/KayakTest.java

代碼思路請參考:

package com.ossez.codebank.interview;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * https://www.cwiki.us/display/ITCLASSIFICATION/Robot+Movement
 * 
 * @author YuCheng
 *
 */
public class KayakRobotMovement {

  private final static Logger logger = LoggerFactory.getLogger(KayakRobotMovement.class);

  /**
   * Get coordinates for Robot Movement
   * 
   * @param data
   * @return
   */
  public static String getCoordinates(String data) {
    logger.debug("BEGIN");

    String retStr = "";

    int x = 0;
    int y = 0;
    int[][] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
    int dir = 0;

    for (char ch : data.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;
    }
    retStr = x + "," + y;

    return retStr;
  }
}

 

 

測試結果

上面程序的測試結果以下:

2018/12/25 15:08:50 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - LFFF - [0,2]
2018/12/25 15:08:50 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - LFFFRFFFRRFFF - [-3,0]

https://www.cwiki.us/display/ITCLASSIFICATION/Robot+Movement

相關文章
相關標籤/搜索