网址: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; }