A robot has been programmed to follow the instructions in its path. Instructions for the next direction the robot is to move are laid down in a grid. The possible instructions are
N north (up the page)
S south (down the page)
E east (to the right on the page)
W west (to the left on the page)
For example, suppose the robot starts on the north (top) side of Grid 1 and starts south (down). The path the robot follows is shown. The robot goes through 10 instructions in the grid before leaving the grid.
Compare what happens in Grid 2: the robot goes through 3 instructions only once, and then starts a loop through 8 instructions, and never exits.
You are to write a program that determines how long it takes a robot to get out of the grid or how the robot loops around.
3 6 5 NEESWE WWWESS SNWWWW 4 5 1 SESWE EESNW NWEEN EWSEN 0 0 0Sample Output
10 step(s) to exit 3 step(s) before a loop of 8 step(s)
题意:3行6列,从第1行第5列开始 ,N向下,S向上,W向左,E向右,能走出去,输出:步数 step(s) to exit
形成死循环,输出:到达循环起点所需步数 step(s) before a loop of 循环大小 step(s)
wa点:
1.字符数组输入,要除去回车(用getchar())。注意,本题(大多数题)要先除去数字输入行的空格,所有要在行输入前除去回车,而不是之后。
2.重新回到起点,算可以出去,不算循环。
AC代码:
# include <iostream>
# include <cstdio>
# include <cstring>
# include <cmath>
using namespace std;
char a[110][110];
int mis[110][110];
int x,y,n,stop,c;
void dfs (int x1,int y1)
{
if ((mis[x1][y1]!=0)||(x1==1&&y1==n&&c))
{
printf("%d step(s) before a loop of %d step(s)\n",mis[x1][y1],stop-mis[x1][y1]);
return ;
}
c=1;
mis[x1][y1]=stop;
stop++;
int x2,y2;
if (a[x1][y1]=='N') {x2=x1-1; y2=y1;}
if (a[x1][y1]=='S') {x2=x1+1; y2=y1;}
if (a[x1][y1]=='W') {x2=x1; y2=y1-1;}
if (a[x1][y1]=='E') {x2=x1; y2=y1+1;}
if ((x2&&y2)&&(x2<=x)&&(y2<=y)) dfs(x2,y2);
else
{
printf ("%d step(s) to exit\n",stop);
return ;
}
}
int main ()
{
// freopen("in.txt","r",stdin);
while ((cin >> x >> y >> n)&&(x||y||n))
{
memset (a,0,sizeof(a));
memset (mis,0,sizeof(mis));
c=0;
for (int i=1;i<=x;i++)
{
getchar();
for (int j=1;j<=y;j++)
{
scanf("%c",&a[i][j]);
}
}
stop=0;
dfs(1,n);
}
return 0;
}