POJ 1573 Robot Motion
[★★☆☆☆]模拟
题目大意:
按照格子里对应的方向行走,看是否会离开房间,思路就是一步步走,用vis[MAXN][MAXN]看是否会进入死循环。如果进入死循环,遍在走一遍,看回到这点需要几步,并记录下来。
样例
输入:
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0输出:
10 step(s) to exit
3 step(s) before a loop of 8 step(s)解题思路:
水题,模拟做非常简单,没有算法上的要求。
代码
#include <iostream>
using namespace std;
char map[15][15];
int zg[15][15];
int A, B, J;
void outm() {
for (int i = 1; i <= A; i++) {
for (int j = 1; j <= B; j++) {
cout << map[i][j];
}
cout << endl;
}
}
void solve() {
int sp = 0, lp = 0;
int x, y;
x = 1; y = J;
zg[x][y] = 0;
int ct = 0;
while (1) {
if (map[x][y] == 'W') y--;
else if (map[x][y] == 'S') x++;
else if (map[x][y] == 'E') y++;
else if (map[x][y] == 'N') x--;
if (x <= 0 || x > A || y <= 0 || y > B) {
++ct;
cout << ct << " step(s) to exit" << endl;
return;
}
if (zg[x][y] == -1) zg[x][y] = ++ct;
else {
lp = ct - zg[x][y] + 1;
sp = zg[x][y];
cout << sp << " step(s) before a loop of " << lp << " step(s)" << endl;
return;
}
}
}
int main() {
while ( (cin >> A >> B >> J) && !(A == 0 && B==0 && J==0)) {
for (int i = 1; i <= A; i++) {
for (int j = 1; j <= B; j++) {
zg[i][j] = -1;
}
}
for (int i = 1; i <= A; i++) {
for (int j = 1; j <= B; j++) {
cin >> map[i][j];
}
}
solve();
}
return 0;
}