【題解】「UVA10116」Robot Motion
阿新 • • 發佈:2020-07-19
Simple Translation
讓你模擬一個機器人行走的過程,如果機器人走入了一個迴圈,輸出不是迴圈的長度和是迴圈的長度,如果最終走出來了,輸出走的步數。
Solution
直接模擬即可,本題難度主要是判斷迴圈,但是其實一點也不難。
首先定義一個 \(a\) 二維陣列,然後將 \(a_{0, i}, a_{m+1, i}, a_{i, 0}, a_{i, n+1}\) 全部賦值為 \(1\),這是因為我們可以通過 \(a\) 陣列來判斷機器人走沒走出地圖。
迴圈模擬機器人走的每一步,並把走到這個地方所花費的步數記錄在 \(a_{x, y}\),每當發現 \(a_{x, y}\) 走過時,即 \(a_{x, y} \neq 0\)
當機器人已經走出地圖時,輸出 \(a_{x, y}\)。
否則,輸出未迴圈的步數和迴圈的步數,如何算這兩個數呢?
我們發現總共走的步數是記錄在 \(a_{x, y}\) 裡面的,而我們走到的下一個格子就是迴圈的開始,所以只要求一下差值,即可得到。
Code
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<string> #define line cout << endl using namespace std; int a[13][13]; char mapp[11][11]; int m, n; int main() { while (cin >> n >> m) { if (m == 0 && n == 0) break; memset (a, 0, sizeof(a)); for (int i = 0; i < m + 2; i++) {//將邊緣全部變為 1 ,下同 a[0][i] = 1; a[m + 1][i] = 1; } for (int i = 0; i < n + 2; i++) { a[i][0] = 1; a[i][n + 1] = 1; } int x = 1, y = 1;//記錄當前座標 cin >> x; for (int j = 1; j <= n; j++) { for (int i = 1; i <= m; i++) { cin >> mapp[i][j]; } } int xx = x, yy = y;//記錄下一個座標 while (!a[xx][yy]) {//如果下一個格子沒走過 a[xx][yy] = 1 + a[x][y];//記錄步數 x = xx;//更新座標 y = yy; switch (mapp[xx][yy]) { case 'N': yy--; break; case 'S': yy++; break; case 'W': xx--; break; case 'E': xx++; break; } } if (xx <= 0 || xx > m || yy <= 0 || yy > n) { //如果已經到達邊緣 cout << a[x][y] << " step(s) to exit" << endl; } else { int s = a[x][y] - (a[x][y] - a[xx][yy] + 1);//求未進如迴圈的步數 cout << s << " step(s) before a loop of " << a[x][y] - a[xx][yy] + 1 << " step(s)" << endl; } } return 0; }