题意简述
一个机器人从指定位置进入一个每格都指向一个确定方向的矩阵。它会顺着格子给定的方向运动。
若机器人能走出矩阵,则输出其经过的格子数量。
若机器人会陷入一个环,则输出经过多少格后,机器人进入了一个格数为多少的环。
算法分析
与POJ-2632类似。直接模拟。
建立一个等大的累加矩阵,存储机器人经过的次数。当机器人碰墙时则认为机器人走出矩阵。计算此时累加矩阵内1的个数。即为经过格子数量。
当机器人到达的点的累加值已经达到2,则说明机器人已经过一个环两次。此时计算累加矩阵内1的个数,即进入环前经过的格子数;计算矩阵内2的个数,即环所占格子数。
Problem Status: AC。时间0ms,内存120k
——————————————————————分割线——————————————————————
优化:
没想到。POJ排名第一仍然是0ms 4k的恐怖数据……
程序样例
#include<stdio.h>
void out(int map[][20], int n, int r, int c) {
int i, j, ans1 = 0, ans2 = 0;
for (i = 0; i < r; i++)
for (j = 0; j < c; j++) {
if (map[i][j] == 1) ans1++;
if (map[i][j] == 2) ans2++;
}
if (n == 1)
printf("%d step(s) to exit\n", ans1);
if (n == 2)
printf("%d step(s) before a loop of %d step(s)\n", ans1, ans2);
}
int main() {
int r, c, i, j, pos[2], b[20][20], flag;
char map[20][20], tem[20];
while (scanf("%d%d%d", & r, & c, & pos[1]), !(r == 0 && c == 0 && pos[1] == 0)) {
pos[0] = 0;
pos[1]--;
for (i = 0; i < r; i++) {
scanf("%s", tem);
for (j = 0; j < c; j++) {
b[i][j] = 0;
map[i][j] = tem[j];
}
}
flag = 1;
while (flag) {
b[pos[0]][pos[1]]++;
switch (map[pos[0]][pos[1]]) {
case 'N':
pos[0]--;
break;
case 'W':
pos[1]--;
break;
case 'S':
pos[0]++;
break;
case 'E':
pos[1]++;
break;
}
if (pos[0] >= 0 && pos[0] < r && pos[1] >= 0 && pos[1] < c) {
if (b[pos[0]][pos[1]] == 2) {
out(b, 2, r, c);
flag = 0;
}
} else {
out(b, 1, r, c);
flag = 0;
}
}
}
}
Leave a Reply