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. R语言-有负下标里才干有零

    1.仅仅有负下标里才干有零 先看一个样例 >a<-c(1,2,3,4) >a[-1:1] > a[-1:1] Error in a[-1:1] : 仅仅有负下标里才干有零 (1 ...

  2. hdu5301(2015多校2)--Buildings(构造)

    Buildings Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  3. 【C语言】编写函数实现库函数atoi,把字符串转换成整形

    //编写函数实现库函数atoi.把字符串转换成整形 #include <stdio.h> #include <string.h> int my_atoi(const char ...

  4. es6常用功能与异步详解(JS高级面试题)

    callback hell方法的使用 可读性不友好 function loadImg(src,callback,fail){ var img = document.createElement('img ...

  5. 防止登录页面出如今frame中

    在使用frame页面嵌套开发的时候,遇到重新启动了server的时候会出现登录页面在frame页面中出现, 所以须要在登录页面里面用js推断下当前的地址信息,然后跳转到登录的单独页面中. js代码例如 ...

  6. 11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方式。

    <span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</s ...

  7. C#正则表达式匹配HTML中的图片路径,图片地址

    C#正则表达式匹配HTML中的图片路径,图片地址 最近的项目中有个关于网页取图的功能需要我自己开发,那就是用正则表达式来匹配图片标签.       一般来说一个 HTML 文档有很多标签,比如“< ...

  8. netty epoll调用示例

    1.服务器端 import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; imp ...

  9. 设计模式--单例模式之Lock

    1.为什么用Lock及关键知识 当我们使用线程的时候,效率最高的方式当然是异步,即个个线程同时运行,其间互不依赖和等待.当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进 ...

  10. Redis学习笔记(六)---List

    1.ArrayList与LinkList的区别 ArrayList的使用数组存入的方式,所以根据索引查询数据速度快,而增删元素是比较慢的,它需要将数据一位一位的移动,知道达到要求. LinkList使 ...