poj1573 Robot Motion(模拟)
题意:在r行c列的地图中,机器人从第一行的start列开始出发,N,S,W,E分别表示北南西东四个方向,问机器人走出地图需要多少步,如果走不出地图,输出走到形成环状的步数以及形成环状路线的总步数。
思路:模拟机器人行走的过程,我是用了一个数组s存图,一个数组vis存步数,一开始地图上的步数都为0,当遇到步数不为0 的情况,说明形成了环状。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=1010; int n,m,k; char s[maxn][maxn]; int vis[maxn][maxn]; int main() { ios::sync_with_stdio(false); while(cin>>n>>m>>k&&(n!=0||m!=0||k!=0)) { memset(s,0,sizeof(s)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cin>>s[i][j]; } memset(vis,0,sizeof(vis)); int flag=-2; vis[1][k]=1; int x=1,y=k; while(1) { if(s[x][y]=='N') { if(x-1<1) flag=-1; else if(vis[x-1][y]==0) { vis[x-1][y]=vis[x][y]+1; x--; } else flag=vis[x-1][y]; } if(s[x][y]=='S') { if(x+1>n) flag=-1; else if(vis[x+1][y]==0) { vis[x+1][y]=vis[x][y]+1; x++; } else flag=vis[x+1][y]; } if(s[x][y]=='E') { if(y+1>m) flag=-1; else if(vis[x][y+1]==0) { vis[x][y+1]=vis[x][y]+1; y++; } else flag=vis[x][y+1]; } if(s[x][y]=='W') { if(y-1<1) flag=-1; else if(vis[x][y-1]==0) { vis[x][y-1]=vis[x][y]+1; y--; } else flag=vis[x][y-1]; } if(flag!=-2){ break; } } if(flag==-1) { printf("%d step(s) to exit\n",vis[x][y]); } else printf("%d step(s) before a loop of %d step(s)\n",flag-1,vis[x][y]-flag+1); } return 0; }