这个题就是个大模拟,个人感觉关键在于搞定尾巴

第一次做竟然全都输出了第一步撞到自己

#include<bits/stdc++.h>
using namespace std;
char a[101];
int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}},d[200][3],n,i,j,err,t,w,f,nx,ny,m;
int main()
{
    //freopen("worm.in","r",stdin);
    //freopen("worm.out","w",stdout);
    scanf("%d",&n);
    while(n>0)
    {
        scanf("%s",a);
        d[1][1]=25;
        d[1][2]=11;
        err=0;
        for(i=2;i<=20;i++)
        {
            d[i][1]=25;
            d[i][2]=i+10;
        }
        t=20;w=1;
        for(i=0;i<n;i++)
        {
            switch(a[i])
            {
                case 'E':f=0;break;
                case 'W':f=1;break;
                case 'S':f=2;break;
                case 'N':f=3;break;
            }
            nx=d[t][1]+dis[f][0];
            ny=d[t][2]+dis[f][1];
            if(nx<=0||nx>50||ny<=0||ny>50)
            {
                err=1;
                m=i+1;
                break;
            }
            w++;
            for(j=w;j<=t-1;j++)
                if(d[j][1]==nx&&d[j][2]==ny)
                {
                    err=2;
                    m=i+1;
                    break;
                }
            if(err==2)
                break;
            d[++t][1]=nx;
            d[t][2]=ny;    
        }
        if(err==0)
            printf("The worm successfully made all %d moves.\n",n);
        if(err==1)
            printf("The worm ran off the board on move %d.\n",m);
        if(err==2)
            printf("The worm ran into itself on move %d.\n",m);        
    scanf("%d",&n);
    }        
    //fclose(stdin);
    //fclose(stdout);
     return 0;
}