Total Submission(s): 3266 Accepted Submission(s): 1519
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
10 step(s) to exit 3 step(s) before a loop of 8 step(s)
,做这种题尤其要注意细节否则会很惨的。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 200
using namespace std;
char map[N][N];
int m,n,begin;
int step[N][N];
bool s[N][N];
int _step,loop;
void dfs(int x,int y)
{
if(map[x][y]=='W')
{
if(y-1<0)
{
loop=0;_step=step[x][y]+1;
}
else if(s[x][y-1])
{
_step=step[x][y-1];
loop=step[x][y]-step[x][y-1]+1;
return;
}
else
{
s[x][y-1]=1;
step[x][y-1]=step[x][y]+1;
dfs(x,y-1);
}
}
if(map[x][y]=='E')
{
if(y+1>=n)
{
loop=0;_step=step[x][y]+1;
return;
}
else if(s[x][y+1])
{
loop=step[x][y]-step[x][y+1]+1;
_step=step[x][y+1];
return;
}
else
{
s[x][y+1]=1;
step[x][y+1]=step[x][y]+1;
dfs(x,y+1);
}
}
if(map[x][y]=='N')
{
if(x-1<0)
{
loop=0;_step=step[x][y]+1;
return;
}
else if(s[x-1][y])
{
loop=step[x][y]-step[x-1][y]+1;
_step=step[x-1][y];
return;
}
else
{
s[x-1][y]=1;
step[x-1][y]=step[x][y]+1;
dfs(x-1,y);
}
}
if(map[x][y]=='S')
{
if(x+1>=m)
{
loop=0;_step=step[x][y]+1;
return;
}
else if(s[x+1][y])
{
_step=step[x+1][y];
loop=step[x][y]-step[x+1][y]+1;
return;
}
else
{
s[x+1][y]=1;
step[x+1][y]=step[x][y]+1;
dfs(x+1,y);
}
}
}
int main()
{
//freopen("4.txt","r",stdin);
while(scanf("%d%d%d",&m,&n,&begin)&&(m||n||begin))
{
memset(map,-1,sizeof(map));
memset(step,0,sizeof(step));
memset(s,0,sizeof(s));
for(int i=0;i<m;i++)
scanf("%s",map[i]);
s[0][begin-1]=1;
dfs(0,begin-1);
if(loop)
printf("%d step(s) before a loop of %d step(s)\n",_step,loop);
else
printf("%d step(s) to exit\n",_step);
}
return 0;
}
8万+



被折叠的 条评论
为什么被折叠?



