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.\n",i+1);
break;
}
if (t.bo[t.x[20]][t.y[20]]>1)
{
ok = false;
printf("The worm ran into itself on move %d.\n",i+1);
break;
}
}
if (ok)
printf("The worm successfully made all %d moves.\n",n);
}
return 0;
}

【t097】寄存器的更多相关文章

  1. DOS程序员手册(九)

    第14章参考手册概述     本书余下的章节将向读者们介绍BIOS.DOS各种各样API函数和服务,作为一名程 序员,了解和掌握这些知识是很有好处的.在所介绍的参考手册中,每部手册都汇集了大 量的资源 ...

  2. K60——寄存器

    (1)PTx_BASE_PTR为GPIO寄存器结构体基址指针(PTR即point to register,x=A/B/C/D/E) /* GPIO - Peripheral instance base ...

  3. JVM之PC寄存器(Program Counter Register)

    基本特性: 当前线程执行的字节码的行号指示器. Java虚拟机支持多个线程同时执行,每一个线程都有自己的pc寄存器. 任意时刻,一个线程都只会执行一个方法的代码,称为该线程的当前方法,对于非nativ ...

  4. 与或左移右移操作在ARM寄存器配置中的作用

    逻辑运算: 与运算&:与0清零  清零用与运算 或运算 |:或1置一  置一用或运算 异或 ^:不同为1  /*****单个寄存器清零置一*************************** ...

  5. 小议ARM寄存器

    ARM微处理器一共有37个32位寄存器,其中包括31个通用寄存器和6个状态寄存器,但是这些寄存处不能同时访问.但是通用寄存器R14 - R0 ,程序计数器PC(即R15),程序状态寄存器都是可以任何时 ...

  6. 汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY

    在8086CPU中,有一种标记寄存器,长度为16bit: 其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag. 功能:1)用来存储相关指令的 ...

  7. [转载]ARM协处理器CP15寄存器详解

    用于系统存储管理的协处理器CP15  原地址:http://blog.csdn.net/gameit/article/details/13169405 MCR{cond}     coproc,opc ...

  8. 2.3 ARM寄存器详解

    一共有37个寄存器 1. 31个通用寄存器 2. 6个状态寄存器 R13作为堆栈指针 R14链接寄存器 1.保存函数返回地址 2. 异常返回地址 R15程序计数器(PC指针) 程序状态寄存器 只有在异 ...

  9. 软件调试——IA-32 保护模式下寄存器一览

    最近在看张银奎先生的<调试软件>一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧. 1 通用寄存器 EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等 ...

随机推荐

  1. 记一次搬迁到 OpenShift 并搭建 PHP5.5 环境等

    http://blog.laobubu.net/archives/move-to-openshift/ 记一次搬迁到 OpenShift 并搭建 PHP5.5 环境等 Nov 24, 2014 十一月 ...

  2. 1.1 Introduction中 Kafka as a Messaging System官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka as a Messaging System kafka作为一个消息系统 ...

  3. jquery中$(dom).each()和$(dom).length的使用

    1.$(dom).each();在dom处理上用的比较多. $(selector).each(function(index,element){ //selector会遍历当前页面里所有匹配的jquer ...

  4. Redis的高级应用-事务处理、持久化、发布与订阅消息、虚拟内存使用

    三.事务处理 Redis的事务处理比较简单.只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接 中发出multi命令时,这个连接就进入一 ...

  5. NYOJ 552 小数阶乘

    小数阶乘 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描写叙述 编写一个程序,求一个数m的阶乘. 输入 有多组測试数据,以EOF结束. 每组測试数据有1个整数m. 输出 每 ...

  6. PHP模拟链表操作

    PHP模拟链表操作 一.总结 1.类成员用的是-> 2.对象节点相连的话,因为是对象,所以不用取地址符号 3.数组传递参数的时候传引用的方法 ,& 二.PHP模拟链表操作 代码一: /* ...

  7. J实现时间格式的转换(附加对象的转换)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 如何使用 PyCharm 将代码上传到远程服务器上(详细图解)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一丶测试说明 1.通过Windows电脑上的PyCharm,将代码上传到虚拟机Ubuntu系统中 需要在虚拟机中安装Ubuntu的 ...

  9. jQuery常用的API

    1.jQuery给标签添加子元素(父子关系) jQuery对象.append("子"); 将div标签插入到ul标签之后 $("ul").append($('d ...

  10. POJ 2387 Til the Cows Come Home (Dijkstra)

    传送门:http://poj.org/problem?id=2387 题目大意: 给定无向图,要求输出从点n到点1的最短路径. 注意有重边,要取最小的. 水题..对于无向图,从1到n和n到1是一样的. ...