网址:http:///index.php?app=problem_title&id=1&problem_id=3823

   这道题说起来也不难,总的来说要注意一些细节,比如头和尾一起走(挨着走,比如沿着x轴正向走,尾在前,头在后),应该是尾先走,然后头走到尾的位置上等。

     这道题交的时候,始终报编译错误,但是VC6.0中不报错,无论怎么改都不行,百度各种搜出现编译错误的原因,后来才发现,STL库中有个与代码中变量end重名的函数,改为end1之后,立马AC,以后一定要注意

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
struct node
{
    int x;
    int y;
};
node start1,end1,temp;
queue<node>Q;
int vis[51][51],sum;
int move1(char str)
{
    if(str == 'N')
        start1.x--;
    else if(str == 'S')
        start1.x++;
    else if(str == 'W')
        start1.y--;
    else
        start1.y++;
    Q.push(start1);
    end1 = Q.front();  //头结点加入队列
    Q.pop();
    vis[end1.x][end1.y] = 0; //将尾节点的位置标记为0(未走过),并抛出;
      
    if(start1.x < 1 || start1.x > 50 || start1.y < 1 || start1.y > 50)
        return 1;
    if(vis[start1.x][start1.y] == 1)
        return 2;
    else
    {
        vis[start1.x][start1.y] = 1;
        return 0;
    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        if(n == 0)
            break;
        sum = 0;
        start1.x = 25; start1.y = 30;
        end1.x = 25; end1.y = 11;
        int i;
        memset(vis, 0, sizeof(vis));
        for(i = 11; i <= 30; i++)
        {
            vis[25][i] = 1;
            temp.x = 25;
            temp.y = i;
            Q.push(temp);  //将整条蛇放入队列中
        }
        char str[100];
        cin>>str;
        for(i = 0; i < n; i++)
        {
            int step = move1(str[i]);
            if(!step)
                continue;
            if(step == 1)
            {
                cout<<"The worm ran off the board on move "<<i + 1<<"."<<endl;
                break;
            }
            if(step == 2)
            {
                cout<<"The worm ran into itself on move "<<i + 1<<"."<<endl;
                break;
            }
        }
        if(i == n)
            cout<<"The worm successfully made all " <<n<<" moves."<<endl;
        while(!Q.empty())
        {
            Q.pop();
        }
    }
    return 0;
}