POJ_1573_Robot Motion(模拟法)
http://poj.org/problem?id=1573
/*
poj 1573 http://poj.org/problem?id=1573
解题思路,题目很形象,也很容易懂,用一个二维数组保存字符,
,当前位置向哪去对应的下标做相应的变化,对于循环情况的处理
申请另个整形数组,一个用于标记当前位置是否被访问在while循环中
使用,一个用于标记达到该位置时花了多少步,那么只要产生循环用
总步数及数组标记的步数相加减既可。
程序需要注意的地方就是最后输出的时候注意多一少一的问题。
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <stdio.h> 2 # include <string.h> 3 int main() 4 { 5 int a[20][20],b[20][20]; 6 int i,j,k,h,t,n,m; 7 char ch[20][20]; 8 while(scanf("%d%d%d",&n,&m,&k) != EOF) 9 { 10 if(n==0 || m==0) 11 break; 12 for(i=0;i<n;i++) 13 { 14 scanf("%s",ch[i]); 15 } 16 h=0;t=k-1; 17 memset(a,0,sizeof(a)); 18 int step=1; 19 while(h>=0 && t>=0 && h<n && t<m && a[h][t]==0) 20 { 21 if(ch[h][t]=='S') 22 { 23 24 a[h][t]=1; 25 b[h][t]=step++;h++; 26 } 27 else if(ch[h][t]=='N') 28 { 29 30 a[h][t]=1; 31 b[h][t]=step++;h--; 32 } 33 else if(ch[h][t]=='W') 34 { 35 36 a[h][t]=1; 37 b[h][t]=step++; t--; 38 } 39 else if(ch[h][t]=='E') 40 { 41 42 a[h][t]=1; 43 b[h][t]=step++; t++; 44 } 45 } 46 if(a[h][t] == 1) 47 printf("%d step(s) before a loop of %d step(s)\n",b[h][t]-1,step-b[h][t]); 48 else 49 printf("%d step(s) to exit\n",step-1); 50 51 } 52 return 0; 53 }