HDU - 1035

时间:2021-03-28 06:40:58

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,,maxn){
rep(j,,maxn)
vis[i][j]=;
}
if(n==&&m==)
break;
scanf("%d",&k);
rep(i,,n)
scanf("%s",s[i]); int r=;
int c=k-;
vis[r][c]=; int ans=;
int cnt=; int f=; while(r>=&&r<n&&c>=&&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<||r>=n||c<||c>=m)//r,c可能小于0,必须加上
break;
if(vis[r][c])
{
f=-;
ans=pre-vis[r][c]+;
cnt=vis[r][c]-;
break;
}
vis[r][c]=pre+;
} if(f==)
{
printf("%d step(s) to exit\n",ans);
}
else if(f==-)
{
printf("%d step(s) before a loop of %d step(s)\n",cnt,ans);
}
}
return ;
}