轉來轉去(結構體版)

0.5s 256M

這題是〔轉來轉去〕的結構體版:輸入輸出與原題完全相同。原題要你實作一個函式,這題要你把機器人的狀態(位置 \((r, c)\) 與方向 dir)和它會做的四個動作綁進同一個結構體 Robot——用第十四單元的寫法重寫一次。

寫好的 Robot 也能直接拿去通過原題:原題只要求實作 turn_and_walk 函式(不用 main、不用 #include),把你的結構體貼進下面的空位,就是轉來轉去的完整解答。

// ===== 把你的 struct Robot 貼在這裡 =====



// ==========================================

vector<int> turn_and_walk(int r, int c, int dir, const string& commands) {
    Robot bot(r, c, dir);                 // 起點交給建構子
    for (char ch : commands) {            // 逐字元執行指令
        if (ch == 'L') bot.turn_left();
        else if (ch == 'R') bot.turn_right();
        else if (ch == 'B') bot.turn_back();
        else bot.forward();
    }
    return {bot.r, bot.c, bot.dir};
}

一個機器人站在無限大的方格平面上,位置是 \((r, c)\),面向方向 dir:0 上、1 右、2 下、3 左。它會做四個動作:原地左轉 \(90\) 度、原地右轉 \(90\) 度、原地迴轉 \(180\) 度,以及朝目前方向前進一格——往上是 \(r\) 減一,往右是 \(c\) 加一,往下是 \(r\) 加一,往左是 \(c\) 減一。平面沒有邊界,也沒有障礙物。

請定義結構體 Robot。成員的名稱、型態與簽名都必須完全一樣:

成員 型態/簽名 意義
r int 目前所在的列
c int 目前所在的欄
dir int 目前面向的方向(\(0\) 到 \(3\))
Robot(int r, int c, int dir) 建構子 依序給起始列、起始欄、起始方向,存進三個成員
void turn_left() 成員函式 原地左轉 \(90\) 度
void turn_right() 成員函式 原地右轉 \(90\) 度
void turn_back() 成員函式 原地迴轉 \(180\) 度
void forward() 成員函式 朝目前方向前進一格

(表格裡建構子的參數名稱只是說明順序,實際取什麼名字由你決定。)

你只需要寫這個結構體的定義,不用寫 main、不用 #include 任何東西——評測程式會自動在你的程式最上方加上這題需要的標頭(<cstdlib>)與 using namespace std;,要用其他標頭自己再 #include 即可。想把含有 main 的完整程式貼上來測試也可以,評測時會忽略你的 main。

可以直接複製下面的骨架來改:

struct Robot {
    int r, c, dir;    // 位置與方向:0 上、1 右、2 下、3 左

    Robot(int start_r, int start_c, int start_dir) {
        // 把三個參數存進成員
    }
    void turn_left() {
        // 方向 0 左轉要變成 3
    }
    void turn_right() {
    }
    void turn_back() {
    }
    void forward() {
        // 依 dir 改變 r 或 c
    }
};

評測程式會做的事

評測程式會 #include 你的程式,然後:

  1. 讀入 \(T\)。
  2. 對每組 r c dir commands,宣告 Robot bot(r, c, dir);,並檢查 bot.r、bot.c、bot.dir 就是傳入的三個值。不是的話,印出一行 [檢查] Robot bot(r, c, dir) 建構後 bot.r、bot.c、bot.dir 必須等於傳入的參數 之後直接結束(結果會是 Wrong Answer;用「測試範例」跑就看得到這行訊息)。
  3. 逐字元執行 commands:L 呼叫 bot.turn_left()、R 呼叫 bot.turn_right()、B 呼叫 bot.turn_back()、F 呼叫 bot.forward()。每道指令做完會檢查 bot.dir 在 \(0\) 到 \(3\) 之間,不是的話印出 [檢查] 執行指令 L 之後 dir 必須在 0 到 3 之間 之類的訊息後直接結束。
  4. 印出一行 bot.r bot.c bot.dir。

若不符合規格,編譯訊息的第一行會告訴你缺了什麼,例如 [檢查] struct Robot 缺少成員函式 forward()。

輸入格式

(這是評測程式讀的輸入。)第一行有一個正整數 \(T\),代表機器人的組數。接下來 \(T\) 行,每行依序包含整數 \(r, c\)、dir 與一個字串 commands,代表一個機器人的起始位置、起始方向與指令串。

限制

  • \(1 \le T \le 100\)
  • \(-1000 \le r, c \le 1000\)
  • \(0 \le\) dir \(\le 3\)
  • \(1 \le |\)commands\(| \le 1000\)
  • commands 只包含 L、R、B、F

輸出格式

對每組機器人,評測程式輸出一行三個整數,依序是全部指令執行完後的 bot.r、bot.c、bot.dir。

範例輸入 1

4
0 0 1 FFRFFLF
5 5 0 BF
0 0 3 LLLL
0 0 2 FLFLFLF

範例輸出 1

2 3 1
6 5 2
0 0 3
0 0 3

範例解釋 1

第 \(1\) 組:機器人先向右走到 \((0, 2)\),右轉後向下走到 \((2, 2)\),最後左轉並向右走到 \((2, 3)\)。

第 \(2\) 組:機器人迴轉後面向下,再前進一格。

第 \(3\) 組:左轉四次回到原方向——注意方向 \(0\) 左轉要變成 \(3\),不能變成 \(-1\)。

題目頁說明

快速鍵

主要功能

  • 範例測試 — 執行題目附帶的範例測資並自動比對預期輸出。
  • 自訂測試 — 自己貼 stdin 執行程式。可勾選「與預期輸出比對 (diff)」做行對行比對。
  • 模板 — 貼上你在個人資料設定的預設程式碼模板。
  • 協作 — 與其他同學共筆編輯這題的程式碼。
  • 自動草稿 — 編輯器內容每 1.5 秒自動存到瀏覽器(per 帳號 / 題目 / 語言)。
  • 提交 — 把程式碼交給 judge 評測,回傳 AC / WA / TLE 等結果。

限制

  • 程式碼最多 65,536 字元
  • 自訂測試 stdin 與預期輸出各最多 1 MB (約 100 萬字元)
  • 自訂測試與範例測試共用一個沙箱,每人約 3 秒 1 次 (範例測試 1 秒 1 次)
  • 自訂測試與範例測試都有 15 秒 牆鐘上限(正式評測仍依題目原本時限)
  • 互動題不提供自訂測試(無法模擬與 judge 互動)。
  • 提交評測本身沒有 rate limit,但同題短時間內多次提交會被視為刷分。