【t097】寄存器
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】寄存器的更多相关文章
- DOS程序员手册(九)
第14章参考手册概述 本书余下的章节将向读者们介绍BIOS.DOS各种各样API函数和服务,作为一名程 序员,了解和掌握这些知识是很有好处的.在所介绍的参考手册中,每部手册都汇集了大 量的资源 ...
- K60——寄存器
(1)PTx_BASE_PTR为GPIO寄存器结构体基址指针(PTR即point to register,x=A/B/C/D/E) /* GPIO - Peripheral instance base ...
- JVM之PC寄存器(Program Counter Register)
基本特性: 当前线程执行的字节码的行号指示器. Java虚拟机支持多个线程同时执行,每一个线程都有自己的pc寄存器. 任意时刻,一个线程都只会执行一个方法的代码,称为该线程的当前方法,对于非nativ ...
- 与或左移右移操作在ARM寄存器配置中的作用
逻辑运算: 与运算&:与0清零 清零用与运算 或运算 |:或1置一 置一用或运算 异或 ^:不同为1 /*****单个寄存器清零置一*************************** ...
- 小议ARM寄存器
ARM微处理器一共有37个32位寄存器,其中包括31个通用寄存器和6个状态寄存器,但是这些寄存处不能同时访问.但是通用寄存器R14 - R0 ,程序计数器PC(即R15),程序状态寄存器都是可以任何时 ...
- 汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY
在8086CPU中,有一种标记寄存器,长度为16bit: 其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag. 功能:1)用来存储相关指令的 ...
- [转载]ARM协处理器CP15寄存器详解
用于系统存储管理的协处理器CP15 原地址:http://blog.csdn.net/gameit/article/details/13169405 MCR{cond} coproc,opc ...
- 2.3 ARM寄存器详解
一共有37个寄存器 1. 31个通用寄存器 2. 6个状态寄存器 R13作为堆栈指针 R14链接寄存器 1.保存函数返回地址 2. 异常返回地址 R15程序计数器(PC指针) 程序状态寄存器 只有在异 ...
- 软件调试——IA-32 保护模式下寄存器一览
最近在看张银奎先生的<调试软件>一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧. 1 通用寄存器 EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等 ...
随机推荐
- meld文件的脚本
今天模仿着别人的脚本,结合网上的资料,摸索着写了一个简单的脚本,用来打开meld 工具.这个脚本虽然简单,但这是第一次自己写脚本,记录下来,作为自己python学习的起点.代码如下 #/use/bin ...
- optionMenu-普通菜单使用
首先结合如下的代码来看 package com.android.settings; import android.R.integer; import android.app.Fragment; imp ...
- 10. Spring Boot JDBC 连接数据库
转自:https://blog.csdn.net/catoop/article/details/50507516
- Android实现微信分享及注意事项
一.获取帮助文档并下载相关资料 首先打开微信开放平台:https://open.weixin.qq.com/ 如果没有注册,请先注册并上传开发者资料等待审核. 资源中心----移动应用开发----分享 ...
- rhel5安装 oracle11
readhat 安装11gr2文档 需要注意的地方:必须关掉的 1,防火墙:2,SElinux . root 用户运行 setup 命令可关防火墙与SElinux 修改网络配置文件,一定要重启此文 ...
- 前台Ajax发送数据给后台
前台发ajax请求给后台 前台代码 let data= [{receiveAdd:receiveAddVal, sendAdd:sendAddVal,distance:distance,goodsNa ...
- 从软件project的角度写机器学习3——主要监督学习算法的project性分析
主要机器学习算法的project适用性分析 前段时间AlphaGo跟李世石的大战及相关的深度学习的新闻刷了一遍又一遍的朋友圈.只是这件事情,也仅仅是在机器学习的深度上进一步拓展,而机器学习的广度(也即 ...
- PythonOOP面向对象编程3
override 函数重写 重写是在自定义的类内添加相应的方法,让自定义的类生成的对象(实例)像内建对象一样进行内建的函数操作 对象转字符串函数重写 repr(obj) 返回一个能代表此对象的表达式字 ...
- YASM User Manual
This document is the user manual for the Yasm assembler. It is intended as both an introduction and ...
- [WASM] Write to WebAssembly Memory from JavaScript
We write a function that converts a string to lowercase in WebAssembly, demonstrating how to set the ...