--- title: 'UVa 118 題解 — C++' disqus: hackmd --- # UVa 118 題解 — C++ :::info :bulb: 此筆記為UVa 118的題目詳解,包含解題思路、C++範例程式碼。 ::: ## Mutant Flatworld Expolrers (ZeroJudge c082.) ### [題目](https://zerojudge.tw/ShowProblem?problemid=c082) :::success 給你一塊矩形土地的長寬,再依序給定每個機器人的初始位置狀況及一連串的指令集,你必須用你的程式求出每個機器人最後的位置狀況。 一個機器人的位置狀況包括了其坐標( x 坐標, y 坐標),和它面向的方向(用 N , S , E , W 來分別代表北、南、東、西)。至於一個機器人所收到的指令集,是一個由字母 ' L ' , ' R ' , 和 ' F ' 所構成的字串,其分別代表: * 左轉(Left):機器人在原地往左轉 90 度。 * 右轉(Right): 機器人在原地往右轉 90 度。 * 前進(Forward): 機器人往其面向的方向向前走一格,且不改變其面向之方向。 從坐標 (x,y) 走至 (x,y+1) 的這個方向我們定義為北方。 因為此矩形土地是有邊界的,所以一旦一個機器人走出邊界掉落下去,就相當於永遠消失了。不過這個掉下去的機器人會留下「標記 ( scent ) 」,提醒以後的機器人,避免他們從同一個地方掉下去。掉下去的機器人會把標記,留在他掉落之前所在的最後一個坐標點。所以對於以後的機器人,當他正位在有標記的地方時,這個機器人就會忽略會讓他掉下去的指令。 ::: ### 輸入 / 輸出說明 | **輸入說明** | **輸出說明** | |:-:|:-:| | ![image](https://hackmd.io/_uploads/HJ9KlFn4C.png) | ![image](https://hackmd.io/_uploads/HyU5xt2E0.png) | ### 解題思路 :::warning 我透過 x、y 紀錄機器人所在的位置、dir 紀錄朝向方向,並比對 dir 與 moved 陣列中的字元,若相同則將 d 設置為該索引值。 我設定 moved[4]={'N','E','S','W'}; ,當指令為 R 時,只需將 $d + 1$ 即可,但當 d + 1 > 3 時,則需將 d 設為 0,因此我利用 d = (d + 1) % 4; 實現;當指令為 L 時,只需將 $d - 1$ 即可,但當 d - 1 = 0 時,則需將 d 設為 3。 此外我設定 move 陣列確定移動方向與朝向的關係,當指令為 F 時,則令 nx、ny 加上指定數值,並依以下規則判斷: 1. 若 nx、ny 超出邊界(掉出世界外) **且** 該位置尚未被標記 => 輸出答案並標記該位置 2. 若 nx、ny 在邊界內 => 將 x、y 更新為 nx、ny 3. 其餘狀況 => 忽略 ::: ### 範例程式碼 ```C++= #include <bits/stdc++.h> using namespace std; int main () { ios::sync_with_stdio(false); cin.tie(0); int i, j; int n, m; cin >> n >> m; int map[n+2][m+2]={}; int x, y, d, nx, ny, lost; char dir; string c; char moved[4]={'N','E','S','W'}; int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; while (cin >> x >> y >> dir >> c) { lost = 0; for (i=0;i<4;i++) if (dir == moved[i]) d = i; for (i=0;i<c.size();i++) { if (c[i] == 'F') { nx = x + move[d][0]; ny = y + move[d][1]; if ((nx < 0 || nx > n || ny < 0 || ny > m) && map[x][y] != 1) { cout << x << " " << y << " " << moved[d] << " LOST" << endl; map[x][y] = 1; lost = 1; break; } else if (nx >= 0 && nx <= n && ny >= 0 && ny <= m) { x = nx; y = ny; } } else if (c[i] == 'R') d = (d + 1) % 4; else { d--; if (d == -1) d = 3; } } if (lost == 0) cout << x << " " << y << " " << moved[d] << endl; } return 0; } ``` ### 運行結果 <font color="#00BB00">**AC**</font> (2ms, 336KB) ###### tags: `CPE 1星` :::danger 查看更多資訊請至:https://www.tseng-school.com/ :::