HDU - 1035
wa了一遍,炸了两遍
(1)迷宫题中的模拟题。只需要简单代码就可以ac。如果程序有问题,最后就会卡死,出现runtime error。
(2)边界问题一定要小心,数组是从0开始的,就要考虑r--会不会小于0,导致访问Vis[r][c]下标越界。正常情况下,越界很有可能是下标为负数引起的,此类问题要当心。
(3)map不要随便用,正常开二维数组vis就可以了。
(4)这种四个方向的,很多操作都重复了,要适当简化代码
代码:
#include<bits/stdc++.h> using namespace std; #define maxn 100 #define rep(i,a,b) for(int i=(a);i<(b);i++) #define ll long long char s[maxn][maxn]; int vis[maxn][maxn]; int main() { int n,m,k; while(~scanf("%d%d",&n,&m)) { rep(i,0,maxn){ rep(j,0,maxn) vis[i][j]=0; } if(n==0&&m==0) break; scanf("%d",&k); rep(i,0,n) scanf("%s",s[i]); int r=0; int c=k-1; vis[r][c]=1; int ans=0; int cnt=0; int f=1; while(r>=0&&r<n&&c>=0&&c<m)//起点也可能在迷宫外,必须加上条件 { int pre=vis[r][c]; ans=vis[r][c]; if(s[r][c]=='S') r++; else if(s[r][c]=='N') r--; else if(s[r][c]=='W') c--; else if(s[r][c]=='E') c++; if(r<0||r>=n||c<0||c>=m)//r,c可能小于0,必须加上 break; if(vis[r][c]) { f=-1; ans=pre-vis[r][c]+1; cnt=vis[r][c]-1; break; } vis[r][c]=pre+1; } if(f==1) { printf("%d step(s) to exit\n",ans); } else if(f==-1) { printf("%d step(s) before a loop of %d step(s)\n",cnt,ans); } } return 0; }