轉來轉去(結構體版)
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 你的程式,然後:
- 讀入 \(T\)。
- 對每組
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;用「測試範例」跑就看得到這行訊息)。 - 逐字元執行
commands:L呼叫bot.turn_left()、R呼叫bot.turn_right()、B呼叫bot.turn_back()、F呼叫bot.forward()。每道指令做完會檢查bot.dir在 \(0\) 到 \(3\) 之間,不是的話印出[檢查] 執行指令 L 之後 dir 必須在 0 到 3 之間之類的訊息後直接結束。 - 印出一行
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\)。