题目描述

  在一个二维网格平面上,一个网格的坐标由其左下角的点的坐标定义$(x,y)$。在一个二维网格平面上,一个网格的坐标由其左下角的个点的坐标定义$(0,0)$的区域中,此时存在高度为$k$的初始砖块,$k\in [1,10]$。然后,在一系列动作中,砖块会滚动到棋盘上的其他位置。一步是将砖块相对于当前板上的墙的四个边缘之一旋转$90°$的角度。作为移动的结果,砖块改变其在平面上的位置,使得它可以沿另一个面继续旋转。砖块的变换的四个可能的方向用字母$N,S,W,E$标记。
  在下图中,有一个高度为$2$的砖,它在初始位置。箭头表示可以由块制作的四种运动。

  在随后的运动中,块被滚动到棋盘的下一个位置,以便其随后的面与地面接触。下图显示了块的移动示例。

  可以发现,每一步之后都会有若干个网格被覆盖。你的任务是这样的,给定高度$k$和操作序列,求出最终被覆盖的网格的坐标以及所有网格中被覆盖次数最多的网格的被覆盖次数。
  注:初始位置算被覆盖一次。


输入格式

第一行整数$N$,表示测试组数。
一组测试数据的输入数据放在两行中。
在第一行中有一个从$1$到$10$的数字,用于定义块在初始位置的高度。
第二行包含长度为$1$到$100$个字符的文本字符串。这些字符是字母$N,S,W,E$,定义了滚动块的四个可能方向。$"N"$表示朝向$y$轴正向翻滚,$"S"$朝向负向$y$轴返回滚动该块。$"E"$表示朝向正$x$轴旋转滚动块,而朝相反方向滚动块$"W"$。


输出格式

输出中,每组测试数据输出三行。
第一行,砖块的最后覆盖位置的$x$坐标,按照从小到大的顺序列出。
第二行,砖块在最终覆盖位置的$y$坐标,按照从小到大的顺序列出。
第三行,输出所有网格中被覆盖次数最多的网格的被覆盖次数。


样例

样例输入:

3
2
ENEESESSESWWWN
5
WNSEWNSEWNSEWWSEN
3
NNEEESESWWNWWWWWSSEEEEENNE

样例输出:

3 3
-3 -2
1-5
0
8
7 8 9
5 5 5
3


数据范围与提示

样例解释:

测试$1$:在$14$个动作中,一个高度为$2$的砖被滚动,在任何区域都没有被覆盖超过一次。完成所有动作后,该块将位于字段$(3,-3)(3,-2)$中。
测试$2$:在$17$次移动中,一个高度为$5$的块被滚动。在其路线中,最多$8$次覆盖了同一网格中。完成所有动作后,该块将被放置在场上$(-5,0)$。
测试$3$:在$26$个动作中,一个高度为$3$的砖被滚动。完成所有动作后,垫将会在场$(7,5)(8,5)(9,5)$中。

数据范围:

对于$40\%$的数据,$k=1$
对于$100\%$的数据,$k\in [1,10],N\in [1,100]$。操作长度$\leqslant 100$


题解

其实就是一道模拟送分题,一堆的$if\ else$就好了。

简单说一下我的做法,我只记录长方体左下角的位置坐标(因为会有负,所以要注意,可以加一个$base$)和现在的状态(分为立着,纵向躺,横向躺),剩下的就看模拟功底了,一般人大约需要$40$分钟。

需要特别注意的一点就是清空问题,千万不要$memset$,或者把数组开小一点,因为最多只会朝一个方向走$550$格(为那些开$5000\times 5000$的人默哀……)。

时间复杂度:$\Theta(N\times k\times |S|)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const int base=570;
int x,y,k,n,now;
char ch[101];
int Map[1151][1151];
int minx,maxx,miny,maxy;
void pre_work()
{
minx=miny=0x3f;
maxx=maxy=0;
x=y=base;
now=0;
}
void N()
{
switch(now)
{
case 0:
for(int i=y+1;i<=y+k;i++)
Map[x][i]++;
y++;
now=1;
return;
case 1:
y+=k;
Map[x][y]++;
now=0;
return;
case 2:
y++;
for(int i=x;i<x+k;i++)
Map[i][y]++;
return;
}
}
void S()
{
switch(now)
{
case 0:
for(int i=y-1;i>=y-k;i--)
Map[x][i]++;
y-=k;
now=1;
return;
case 1:
y--;
Map[x][y]++;
now=0;
return;
case 2:
y--;
for(int i=x;i<x+k;i++)
Map[i][y]++;
return;
}
}
void W()
{
switch(now)
{
case 0:
for(int i=x-k;i<x;i++)
Map[i][y]++;
x-=k;
now=2;
return;
case 1:
x--;
for(int i=y;i<y+k;i++)
Map[x][i]++;
return;
case 2:
x--;
Map[x][y]++;
now=0;
return;
}
}
void E()
{
switch(now)
{
case 0:
for(int i=x+1;i<=x+k;i++)
Map[i][y]++;
x++;
now=2;
return;
case 1:
x++;
for(int i=y;i<y+k;i++)
Map[x][i]++;
return;
case 2:
x+=k;
Map[x][y]++;
now=0;
return;
}
}
void getxy()
{
switch(now)
{
case 0:
printf("%d\n%d\n",x-base,y-base);
return;
case 1:
for(int i=1;i<=k;i++)printf("%d ",x-base);
puts("");
for(int i=y;i<y+k;i++)printf("%d ",i-base);
puts("");
return;
case 2:
for(int i=x;i<x+k;i++)printf("%d ",i-base);
puts("");
for(int i=1;i<=k;i++)printf("%d ",y-base);
puts("");
return;
}
}
int getmx()
{
int res=0;
for(int i=minx;i<maxx+k;i++)
for(int j=miny;j<maxy+k;j++)
{
res=max(res,Map[i][j]);
Map[i][j]=0;
}
return res;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
pre_work();
scanf("%d%s",&k,ch+1);
n=strlen(ch+1);
Map[base][base]=1;
for(int i=1;i<=n;i++)
{
switch(ch[i])
{
case 'N':N();break;
case 'S':S();break;
case 'W':W();break;
case 'E':E();break;
}
minx=min(x,minx);
miny=min(y,miny);
maxx=max(x,maxx);
maxy=max(y,maxy);
}
getxy();
printf("%d\n",getmx());
}
return 0;
}

rp++

[CSP-S模拟测试]:砖块(模拟)的更多相关文章

  1. 模拟测试—moq:简单一两句

    在Xunit的基础上,说话模拟测试. 假如我们有这样一个控制器里面有这样一个方法,如图 我们在对Bar测试得时候,如果测试未通过,错误有可能来至于Bar,也有可能错误来至于serverde Foo方法 ...

  2. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  3. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  4. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  5. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  6. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  7. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  8. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  9. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

随机推荐

  1. 16/7/7_PHP-构造\解析函数

    昨天又问老师问题,老师还是强调要用博客之类记录下每天的学习的习惯. 我个人的想法是一些知识点不用笔记一下 在脑海的理解不是太深.但是老师都这么说了我老师乖乖的记录下今天的学习的一些知识.心得.技巧等等 ...

  2. node和数据库建立连接

    var express = require('express') , app = express(); var querystring = require('querystring'); var ut ...

  3. 编程字体Source Code Pro 免费下载

    对于程序员来说,好的字体应该满足的基本条件: 字母和数字易于分辨,如: 英文字母o 和 阿拉伯数字 0 ,或者 英文字母 l 和 阿拉伯数字 1 ,两个单引号 '' 和双引号 ”. 字体等宽,保持对齐 ...

  4. TensorFlow学习笔记7-深度前馈网络(多层感知机)

    深度前馈网络(前馈神经网络,多层感知机) 神经网络基本概念 前馈神经网络在模型输出和模型本身之间没有反馈连接;前馈神经网络包含反馈连接时,称为循环神经网络. 前馈神经网络用有向无环图表示. 设三个函数 ...

  5. linux中编写查看内存使用率的shell脚本,并以高亮颜色输出结果

    编辑脚本内容: #!/bin/bash MEMUSER=`free -m|grep -i mem|awk '{print $3/$2*100"%"}'` echo -e " ...

  6. docker添加加速器

    通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像.该镜像托管于中国大陆,本地用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker ...

  7. 知乎使用selenium反爬虫的解决方案

    from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOp ...

  8. 问题 C: 序列交换

    问题 C: 序列交换 时间限制: 1 Sec  内存限制: 128 MB提交: 914  解决: 48[提交] [状态] [命题人:jsu_admin] 题目描述 给一个 1 到 n 的排列,每次可以 ...

  9. ORACLE之字符集修改(10g)

    当从oracle服务器将数据导出成dmp文件后,再导入到本地的oracle数据库时,出现: IMP-00019: 由于 ORACLE 错误 12899 而拒绝行 IMP-00003: 遇到 ORACL ...

  10. 【新手向】一个超简单的基于jQuery ajax的天气预报Demo

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