题目链接:http://poj.org/problem?id=1573
这是寒假的时候就做过的题了,经典的模拟,控制一个小人,根据地上的命令行走,问第几步走出去或者如果遇到了循环,问在第几步遇到了循环,这个循环有多少步。
不过再一次做WA了一回,原因是没有控制好边界
if (x < 0 || y < 0 || x >= n || y >= m)
{
tf = 1;
break;
}
中没有加等号,导致没有及时跳出。
不过有一组好玩的数据可以测这种情况
1 1 1
S
好了,这种简单模拟不多说。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int bj[12][12];
char MAP[12][12];
int main()
{
int n,m,s;
while (~scanf ("%d%d%d",&n,&m,&s) && (n || m || s))
{
memset (bj,0,sizeof (bj));
memset (MAP,0,sizeof (MAP));
int i,k;
for (i = 0;i < n;i++)
scanf ("%s",MAP[i]);
int x = 0,y = s - 1;
bj[x][y] = 1;
int tf = 0,step = 0,tstep = 0;
while (bj[x][y] != 3)
{
switch (MAP[x][y])
{
case 'N':
x--;
break;
case 'S':
x++;
break;
case 'E':
y++;
break;
case 'W':
y--;
break;
}
step++;
if (x < 0 || y < 0 || x >= n || y >= m)
{
tf = 1;
break;
}
bj[x][y]++;
if (bj[x][y] == 2)
tstep++;
}
if (tf)
printf ("%d step(s) to exit\n",step);
else
printf ("%d step(s) before a loop of %d step(s)\n",step - 2 * tstep,tstep);
}
return 0;
}