Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
蠕虫是一个古老的电脑游戏,它有许多版本。但所有版本都有一个共同的规则:操纵一 条蠕虫在屏幕上转圈,并试着去避免撞到自
己或障碍物。
这里我们将模拟一个简单的版本。游戏将在50*50的棋盘上进行,棋盘的左上角为(1,1), 蠕虫在初始时是一串20个相连的
方格。所谓相连是指方格在水平或垂直方向上相接。蠕虫 开始时是水平地伸展开的,从(25,11)到(25,30)。其中(25,30)是它
的头。蠕虫只能向东(E)、西 (W)、南(S)、北(N)四个方向移动,但不能向自己移动,因此在开始时向西(W)是不允许的。 每次
移动时,蠕虫向给定的方向移动,一次只移一格,并且保持它的长度不变。因此只有蠕 虫的头和尾所占据的方格在移动一步后
被改变。注意:蠕虫的头能移动到虫尾刚刚让出的空 格。
你将被给定一系列移动指令并模拟虫的移动,直到:蠕虫撞上了自己;蠕虫越出了棋盘;蠕虫成功地完成了这些指令。在
前两种情况下你应当忽略剩下的指令。
【输入格式】
每个输入文件包含了多组数据。每个数据占2行,第1行是一个整数n(n<100),表示移 动指令的指令数(以n=0)表示输入结束;第2
行包括了n个字符(E、W、S、N),字符之间没 有空格,表示移动的指令。
【输出格式】
每个数据输出一行,格式为以下3种中的一种:
The worm ran into inself on move m.
The worm ran off the board on move m.
The worm successfully made all m moves.
注:m是你要决定输出的步数。
Sample Input
18
NWWWWWWWWWWSESSSWS
20
SSSWWNENNNNNWWWWSSSS
30
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
13
SWWWWWWWWWNEE
0
Sample Output
The worm successfully made all 18 moves.
The worm ran into inself on move 9.
The worm ran off the board on move 21.
The worm successfully made all 13 moves.
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t097
【题解】
用一个struct记录这条虫的20个身体组成部分的坐标;
一个50*50的数组记录每个位置被几个身体占据;
一个大小为20的数组记录身体的每个位置当前要往哪里移动;
一开始,所有的身体除了头部(编号为20)不移动,其他都标记为向右移动;
看看新给的命令是什么;记录fx[20]=所给命令;
然后从1..20每个部位都执行相应的移动;
然后1..19这些部位新的移动方向为i+1;
即
for (int i = 1;i <= 19;i++)
fx[i] = fx[i+1];
这样就能模拟虫的移动了;
如果头部新的位置被身体的多个位置(>1)占据了;输出撞上自己;
如果头部的位置出界了;
输出出界信息即可;
移动那些操作都能写在一个结构体里面;很方便;
题目的itself写成inself了;改一下。
【完整代码】
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int n;
string s;
void change(int &x,int &y,char key)
{
if (key=='E')
y++;
if (key=='W')
y--;
if (key=='S')
x++;
if (key=='N')
x--;
}
struct abc
{
int x[25],y[25];
int bo[50+5][50+5];
char fx[25];
void init()
{
for (int i = 1;i <= 50;i++)
for (int j = 1;j <= 50;j++)
bo[i][j] = 0;
for (int i = 1;i <= 20;i++)
{
x[i] = 25,y[i] = 10+i,fx[i] = 'E';
bo[25][y[i]] = 1;
}
}
void east()
{
fx[20] = 'E';
for (int i = 1;i <= 20;i++)
{
bo[x[i]][y[i]]--;
change(x[i],y[i],fx[i]);
bo[x[i]][y[i]]++;
}
for (int i = 1;i<=19;i++)
fx[i] = fx[i+1];
}
void west()
{
fx[20] = 'W';
for (int i = 1;i <= 20;i++)
{
bo[x[i]][y[i]]--;
change(x[i],y[i],fx[i]);
bo[x[i]][y[i]]++;
}
for (int i = 1;i<=19;i++)
fx[i] = fx[i+1];
}
void south()
{
fx[20] = 'S';
for (int i = 1;i <= 20;i++)
{
bo[x[i]][y[i]]--;
change(x[i],y[i],fx[i]);
bo[x[i]][y[i]]++;
}
for (int i = 1;i<=19;i++)
fx[i] = fx[i+1];
}
void north()
{
fx[20] = 'N';
for (int i = 1;i <= 20;i++)
{
bo[x[i]][y[i]]--;
change(x[i],y[i],fx[i]);
bo[x[i]][y[i]]++;
}
for (int i = 1;i<=19;i++)
fx[i] = fx[i+1];
}
void ope(char key)
{
if (key=='E')
east();
if (key=='W')
west();
if (key=='S')
south();
if (key=='N')
north();
}
};
bool out(int x,int y)
{
if (x>50) return true;
if (x<1) return true;
if (y>50) return true;
if (y<1) return true;
return false;
}
int main()
{
//freopen("F:\rush.txt","r",stdin);
while (cin >> n)
{
if (n==0) break;
cin >> s;
abc t;
t.init();
int len = s.size();
bool ok = true;
for (int i = 0;i <= len-1;i++)
{
t.ope(s[i]);
if (out(t.x[20],t.y[20]))
{
ok = false;
printf("The worm ran off the board on move %d.
",i+1);
break;
}
if (t.bo[t.x[20]][t.y[20]]>1)
{
ok = false;
printf("The worm ran into itself on move %d.
",i+1);
break;
}
}
if (ok)
printf("The worm successfully made all %d moves.
",n);
}
return 0;
}