题目大意:一个机器人进入一个矩形阵列中,矩形中每一点都标有下一步可以移动的方向(向东南西北之中的一个方向移动),现在给你机器人进入矩形的位置,问你机器人能否走出该矩形阵列。如果能,输出在矩形中一共走了多少步,如果走不出(机器人走不出该矩形当且仅当在移动过程中遇到了环),找出环的大小和机器人从进入矩形到走到环之间的距离。
分析:模拟题。由于题中给出的矩形大小是1到10,直接枚举就行。由机器人进入的点开始,用一个while(true)循环,直到遇见终止条件时跳出。我们按当前点的方向不断更新机器人所在的位置,同时标记机器人所走过的路以及机器人从进入点到当前点所走的距离cnt,如果机器人走出矩形,那么跳出while循环同时输出cnt;如果遇到了环(我们前面已经标记了机器人所走过的点,如果遇到了机器人将要走到的下一步已被标记,那么就说明遇到了环),加入一个新的变量circle来纪录环的大小,具体做法还是用一个while循环,当再次回到了这点时跳出循环,cnt-circle-1即为遇到环之前所走的路。
实现代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,m,start;
int s[15][15];
char map[15][15];
void solve()
{
int cnt=1,circle=0;
int a=1,b=start;
bool flag=true;
while(1)
{
s[a][b]++;
switch(map[a][b])
{
case 'E':b+=1;break;
case 'W':b-=1;break;
case 'S':a+=1;break;
case 'N':a-=1;break;
}
if(a>n||a<=0||b>m||b<=0) break;
cnt++;
if(s[a][b]==1)
{
flag=false;
while(s[a][b]!=2)
{
s[a][b]++;
switch(map[a][b])
{
case 'E':b+=1;break;
case 'W':b-=1;break;
case 'S':a+=1;break;
case 'N':a-=1;break;
}
circle++;
}
break;
}
}
if(flag) printf("%d step(s) to exit\n",cnt);
else printf("%d step(s) before a loop of %d step(s)\n",cnt-circle-1,circle);
}
int main()
{
int i,j;
while(scanf("%d%d%d",&n,&m,&start))
{
if(n==0&&m==0&&start==0) break;
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>map[i][j];
solve();
}
return 0;
}