【题解】「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} eq 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;
}
原文地址:https://www.cnblogs.com/-TNT-/p/solution-uva10116.html