//hdu 1035 Robot Motion(模拟)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=20;
char ma[N][N];
int mp1[N][N];
bool flag[N*N];
int n,m,k;
int ansstep,ansloop;
void init()
{
memset(flag,false,sizeof(flag));
ansstep=0;ansloop=0;
memset(mp1,0,sizeof(mp1));
}
bool samebfs(int di,int dj)
{
int dt=di*m+dj;
queue<int> q;
q.push(dt);
flag[dt]=true;
while(!q.empty())
{
int tem=q.front();q.pop();
int ti=tem/m;
int tj=tem%m;
if(ma[ti][tj]=='E')
{
if((tj+1)>=m)
{
ansstep=mp1[ti][tj]+1;
return true;
}
tj=tj+1;
dt=ti*m+tj;
if(flag[dt]==false)
{
mp1[ti][tj]=mp1[ti][tj-1]+1;
q.push(dt);
flag[dt]=true;
}
else
{
ansstep=mp1[ti][tj];
ansloop=mp1[ti][tj-1]-mp1[ti][tj];
break;
}
}
else if(ma[ti][tj]=='W')
{
if(tj-1<0)
{
ansstep=mp1[ti][tj]+1;
return true;
}
tj=tj-1;
dt=ti*m+tj;
if(flag[dt]==false)
{
mp1[ti][tj]=mp1[ti][tj+1]+1;
q.push(dt);
flag[dt]=true;
}
else
{
ansstep=mp1[ti][tj];
ansloop=mp1[ti][tj+1]-mp1[ti][tj];
break;
}
}
else if(ma[ti][tj]=='N')
{
if(ti-1<0)
{
ansstep=mp1[ti][tj]+1;
return true;
}
ti=ti-1;
dt=ti*m+tj;
if(flag[dt]==false)
{
mp1[ti][tj]=mp1[ti+1][tj]+1;
q.push(dt);
flag[dt]=true;
}
else
{
ansstep=mp1[ti][tj];
ansloop=mp1[ti+1][tj]-mp1[ti][tj];
break;
}
}
else if(ma[ti][tj]=='S')
{
if(ti+1>=n)
{
ansstep=mp1[ti][tj]+1;
return true;
}
ti=ti+1;
dt=ti*m+tj;
if(flag[dt]==false)
{
mp1[ti][tj]=mp1[ti-1][tj]+1;
q.push(dt);
flag[dt]=true;
}
else
{
ansstep=mp1[ti][tj];
ansloop=mp1[ti-1][tj]-mp1[ti][tj];
break;
}
}
}
ansloop+=1;
return false;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
if(n==0&&m==0) break;
scanf("%d",&k);
for(int i=0;i<n;i++)
{
scanf("%s",ma[i]);
}
bool vis=samebfs(0,k-1);
if(vis)
{
printf("%d step(s) to exit\n",ansstep);
}
else
{
printf("%d step(s) before a loop of %d step(s)\n",ansstep,ansloop);
}
}
return 0;
}
hdu 1035 Robot Motion(模拟)

最新推荐文章于 2024-07-23 13:16:54 发布
