1. 程式人生 > 實用技巧 >【題解】「UVA10116」Robot Motion

【題解】「UVA10116」Robot Motion

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;
}