模拟他给的方向走,判断一个循环即可
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int dx[5]={0,0,1,0,-1}; 5 int dy[5]={0,1,0,-1,0}; 6 char s[1000]; 7 int map[1000][1000]; 8 int flag[1000][1000]; 9 bool lop; 10 int n,m,k,x,y,t; 11 bool check(int const &x,int const &y) 12 { 13 return 0<=x&&x<n&&0<=y&&y<m; 14 } 15 void walk(){ 16 t=lop=x=0,y=k-1; 17 while(check(x,y)) 18 { 19 if(flag[x][y]){ 20 lop=1; break; 21 } 22 flag[x][y]=++t; 23 int tmp=x; 24 x+=dx[map[x][y]]; 25 y+=dy[map[tmp][y]]; 26 // cout<<x<<y<<endl; 27 } 28 if(lop){ 29 printf("%d step(s) before a loop of %d step(s) ",flag[x][y]-1,1+t-flag[x][y]); 30 } else { 31 printf("%d step(s) to exit ",t); 32 } 33 } 34 int main() 35 { 36 while(~scanf("%d%d",&n,&m),(n+m)) 37 { 38 scanf("%d",&k); 39 for(int i=0;i<n;i++) 40 { 41 scanf("%s",&s); 42 for(int j=0;j<m;j++) 43 { 44 if(s[j]=='E') map[i][j]=1; 45 else if(s[j]=='S') map[i][j]=2; 46 else if(s[j]=='W') map[i][j]=3; 47 else map[i][j]=4; 48 } 49 } 50 memset(flag,0,sizeof(flag)); 51 walk(); 52 } 53 }