POJ 1573(模拟)
有一点想不到怎么记录循环的步数,看了一下题解,用vis数组记录到每一个所需走的步数。写得有点乱。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 using namespace std; 10 int n,m,k; 11 char a[200][200]; 12 int vis[200][200]; 13 int flag,sum,sum1; 14 void dfs(int x,int y,int cout) 15 { 16 if(vis[x][y]) 17 { 18 flag=2; 19 sum=cout-vis[x][y]; 20 sum1=vis[x][y]; 21 return; 22 } 23 if(x<0||y<0||x>=n||y>=m) 24 { 25 flag=1; 26 sum=cout; 27 return; 28 } 29 if(flag) 30 return; 31 vis[x][y]=cout; 32 if(a[x][y]=='N') 33 { 34 dfs(x-1,y,cout+1); 35 if(flag) 36 return; 37 } 38 else if(a[x][y]=='S') 39 { 40 dfs(x+1,y,cout+1); 41 if(flag) 42 return; 43 } 44 else if(a[x][y]=='E') 45 { 46 dfs(x,y+1,cout+1); 47 if(flag) 48 return; 49 } 50 else if(a[x][y]=='W') 51 { 52 dfs(x,y-1,cout+1); 53 if(flag) 54 return; 55 } 56 } 57 int main(int argc, char *argv[]) 58 { 59 60 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 61 { 62 if(n==0&&m==0&&k==0) 63 break; 64 for(int i=0;i<n;i++) 65 scanf("%s",a[i]); 66 k--;memset(vis,0,sizeof(vis)); 67 flag=0; 68 dfs(0,k,1); 69 if(flag==1) 70 printf("%d step(s) to exit\n",sum-1); 71 if(flag==2) 72 printf("%d step(s) before a loop of %d step(s)\n",sum1-1,sum); 73 } 74 return 0; 75 }

浙公网安备 33010602011771号