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. 数据库SQL Server2012笔记(七)——java 程序操作sql server

    1.crud(增删改查)介绍:create/retrieve/update/delete 2.JDBC介绍 1)JDBC(java database connectivity,java数据库连接) 2 ...

  2. Jszip的使用和打包下载图片

    因为canvas总结到后面又想到了jszip的一些事情,那就索性也回去看看吧.试过,至少谷歌和火狐都是支持jszip的. 1.  jszip的使用 官方文档说的很清楚了,而且也有读取zip文件.生成z ...

  3. poj 1191 棋盘切割 (压缩dp+记忆化搜索)

    一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include & ...

  4. Ubuntu 12.04 64bit GCC交叉编译器制作 原创

                                                                                                        ...

  5. iOS_05_变量的内存分析、Scanf函数

    一.变量的内存分析 1.字节和地址 * 为了更好地理解变量在内存中得存储细节,先来认识一下内存中得”字节“和”地址“. * 内存以字节为单位 * 不同类型占用的字节是不一样的,数据越大,所需的字节数九 ...

  6. 芯片AMS1117 电源芯片

  7. Javascript和jquery事件--点击事件和触发超链接

    前面的不过是一些基础的知识,真正的一些事件还是有点不同.还有一些命名空间的问题.不过现在ie也开始接受W3C标准,而且平时开发也很少考虑ie了,一些事件就不考虑ie了. 点击事件--click 大部分 ...

  8. sea.js五分钟上手

    SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架.本文给大家分享sea.js知识总结,感兴趣的朋友一起学习吧http://reactjs.cn/http://reactjs. ...

  9. 【高德地图API】从零開始学高德JS API(五)路线规划——驾车|公交|步行

    先来看两个问题:路线规划与导航有什么差别?步行导航与驾车导航有什么差别? 回答: 1.路线规划,指的是为用户提供3条路线推荐.[高德]在提供路线规划的时候,会提供用户自己定义路线规划功能,这是别家没有 ...

  10. 每日技术总结:jquery datetimepicker,微博QQ好友QQ空间微信等分享接口

    前言: 1.jquery datetimepicker 今天遇到一个日期控件格式的问题,默认选中显示的并不是设定的值,而是当天的日期.于是去查了一遍文档. 参考文章:jquery datetimepi ...