開啟章節選單

118 Mutant Flatworld Explorers

題目連結

題目敘述

在一個矩形網格上,每個機器人從一個初始位置開始,根據指令移動,請模擬它們的最終位置。 機器人位置由一對整數座標 (x, y) 和一個方向(N、S、E、W)組成。 (x, y) 的北方為 (x, y + 1)

指令 :

  • L : 向左轉 90 度,不改變位置。
  • R : 向右轉 90 度,不改變位置。
  • F : 往目前面向的方向前進一格,方向不變。

規則 :

  • 地圖是矩形且有邊界,若機器人前進導致超出邊界,該機器人會永遠遺失(LOST)。

  • 當一個機器人遺失時,它會在最後所在的合法位置留下氣味(scent)。

  • 未來的機器人如果從這個留下氣味的位置收到同樣會導致掉落的 F 指令,則該指令會被忽略(避免再次掉落),但其他指令仍照常執行。

輸入格式

  • 第一行為網格右上角的座標 X Y(左下角預設為 0 0

接下來每兩行描述一台機器人,有多個機器人:

  • 第一行:初始座標 x y 與初始方向 ONESW
  • 第二行:一串指令,由 L(左轉)、R(右轉)、F(前進)組成

輸出格式

每台機器人最終停留的座標 x y 與朝向 O

若機器人掉出邊界,則在最後加上 LOST

解題思路

模擬機器人路徑,若座標在 scent 則忽略此指令,若掉出邊界將座標加入 scent。

程式碼

#include <bits/stdc++.h>
using namespace std;

int main() {
  int maxX, maxY;
  cin >> maxX >> maxY;

  set<pair<int, int>> scent;

  int curX, curY;
  string orientation, commands;

  while (cin >> curX >> curY >> orientation >> commands) {
    bool isLost = false;

    for (char command : commands) {
      int prevX = curX, prevY = curY;
      string prevOrientation = orientation;

      if (command == 'L') {
        if (orientation == "N")
          orientation = "W";
        else if (orientation == "W")
          orientation = "S";
        else if (orientation == "S")
          orientation = "E";
        else if (orientation == "E")
          orientation = "N";
      } else if (command == 'R') {
        if (orientation == "N")
          orientation = "E";
        else if (orientation == "E")
          orientation = "S";
        else if (orientation == "S")
          orientation = "W";
        else if (orientation == "W")
          orientation = "N";
      } else if (command == 'F') {
        if (orientation == "N")
          curY++;
        else if (orientation == "E")
          curX++;
        else if (orientation == "S")
          curY--;
        else if (orientation == "W")
          curX--;
      }

      if (curX < 0 || curX > maxX || curY < 0 || curY > maxY) {
        if (scent.count({prevX, prevY})) {
          curX = prevX;
          curY = prevY;
        } else {
          isLost = true;
          scent.insert({prevX, prevY});
          curX = prevX;
          curY = prevY;
          break;
        }
      }
    }

    cout << curX << " " << curY << " " << orientation;
    if (isLost) cout << " LOST";
    cout << "\n";
  }

  return 0;
}