HDU

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
",ans);
        }
        else if(f==-1)
        {
            printf("%d step(s) before a loop of %d step(s)
",cnt,ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/pipitongkw1/p/10714603.html