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