http://codeforces.com/gym/100497

codeforces

2014-2015 CT S02E04: Codeforces Trainings Season 2 Episode 4 (US College Rockethon 2014 + COCI 2008-5 + GCJ Finals 2008 C)

D题

题意:给出一个n*n方阵,原始全为点,给出m个操作,操作有三种:

1.将x,y为左上角的3*3的格替换为给出的3*3矩阵(元素为点或者X)

2.顺时针/逆时针旋转

3.垂直/水平翻转

求最后的方阵。

题解:不用真的将方阵转来转去,只需要将当前的坐标对应到一开始的方阵的坐标,在一开始的方阵上改就行。

根据观察,转来转去翻来翻去,其实都可以由先转0~3个90度顺时针,再进行翻转而得到。

设ro为当前状态所需先转的90度的个数,mr[0]为是否垂直翻转,mr[1]为是否水平翻转。

然后,翻转操作就是改相应的mr就行。

旋转操作除了改ro,因为之前做的翻转操作不能直接当成最后做的翻转操作,mr也要进行修改。经过研究,旋转一下就swap(mr[0],mr[1])就行。

这样,我们就把无数操作得到的结果,用旋转0~3次+翻转0~2次得到。

也就是我们现在的某个坐标x y,可以换算成一开始的方阵的坐标。这个我们可以用一个函数来搞,复杂度就O(1),我都怕。

这样,m次操作,复杂度O(m)。最后输出方阵,复杂度O(n^2)。一共就O(n^2+m),哇。

具体实现看代码,特别简单,我自己都怕。虚拟训练中还怒拿了1血,我自己都怕。

代码:

 //#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
#define ll __int64
#define usint unsigned int
#define mz(array) memset(array, 0, sizeof(array))
#define mf1(array) memset(array, -1, sizeof(array))
#define minf(array) memset(array, 0x3f, sizeof(array))
#define REP(i,n) for(i=0;i<(n);i++)
#define FOR(i,x,n) for(i=(x);i<=(n);i++)
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define WN(x) printf("%d\n",x);
#define RE freopen("D.in","r",stdin)
#define WE freopen("1.out","w",stdout)
const int maxn=;
int n,m;
char a[maxn][maxn];
char s[]; int ro,mr[]; inline void gank(int &x,int &y) {
int tx,i;
if(mr[]==){
x=n-x+;
}
if(mr[]==){
y=n-y+;
}
FOR(i,,ro){
tx=n-y+;
y=x;
x=tx;
}
} inline void mir(const int &q) {
mr[q]^=;
} inline void rot(const int &q) {
ro+=q+;
ro%=;
swap(mr[],mr[]);
} inline void init() {
ro=;
mz(mr);
} int main() {
char c;
int x,y,i,j,k;
while(RD2(n,m)!=EOF) {
FOR(i,,n) {
FOR(j,,n) {
a[i][j]='.';
}
}
init();
FOR(i,,m) {
scanf(" %s",s);
if(s[]=='O') { ///ROTATE
scanf(" %s",s);
if(s[]=='W') { ///CW
rot();
} else { ///CCW
rot(-);
}
} else if(s[]=='I') { ///MIRROR
scanf(" %s",s);
if(s[]=='H') { ///HOR-¡ü¡ý
mir();
} else { ///VER|¡û¡ú
mir();
}
} else if(s[]=='E') { ///REPLACE
scanf("%d%d",&x,&y);
FOR(k,x,x+)
FOR(j,y,y+) {
int tx=k;
int ty=j;
gank(tx,ty);
scanf(" %c",&a[tx][ty]);
}
}
//printf("%d,%d,%d\n",ro,mr[0],mr[1]);
}
FOR(i,,n) {
FOR(j,,n) {
x=i,y=j;
gank(x,y);
//printf("(%d,%d)",x,y);
putchar(a[x][y]);
}
puts("");
}
}
}

另外输入的好莱森是垂直翻转,另一个是水平翻转……看来英文的说法和汉语不太一样?

CFgym Board Queries (旋转、翻转简化)的更多相关文章

  1. Excel 二维数组(数据块)旋转/翻转技巧

    Excel 二维数组(数据块)旋转/翻转技巧 原创 2017-12-30 久石六 久石六 工作中遇到个问题,需要将Excel中的数据块或者说二维数组向右旋转90度,才能再加工处理.当然,不是旋转文本方 ...

  2. NOI题库 09:图像旋转翻转变换

    NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...

  3. poj 1286 Necklace of Beads (polya(旋转+翻转)+模板)

      Description Beads of red, blue or green colors are connected together into a circular necklace of ...

  4. ImageMagick实现图片的旋转/翻转/裁剪(ImageMagick6.9.10)

    一,imagemagick的安装 请参见: https://www.cnblogs.com/architectforest/p/12807514.html 说明:刘宏缔的架构森林是一个专注架构的博客, ...

  5. CSS旋转&翻转,兼容方案

    CSS代码,高级浏览器使用transform,ie用滤镜实现. 转自http://aijuans.iteye.com/blog/19364921 /*水平翻转*/ 2 .flipx { 3 -moz- ...

  6. Android群英传笔记——第六章:Android绘图机制与处理技巧

    Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...

  7. LeetCode数组刷题——448、48、240、769

    1.[LeetCode448]:448. 找到所有数组中消失的数字 题目分析: 1-n之间有重复的,有没出现的,有出现一次.使用hashmap,空间复杂度为O(n) 方法一:哈希表,但是空间复杂度超过 ...

  8. polya/burnside 学习

    参考链接: http://www.cnblogs.com/hankers/archive/2012/08/03/2622231.html http://blog.csdn.net/raalghul/a ...

  9. ImageLoader框架的使用、调用系统相册显示图片并裁剪显示、保存图片的两种方式

    ImageLoader虽然说是一个相对于比较老的一个框架了 ,但是总的来说,还是比较好用的,今天我就总结了一下它的用法.还有调用系统相册并裁剪,以及,通过sharedpreference和文件存储来保 ...

随机推荐

  1. 【BZOJ-4422】Cow Confinement 线段树 + 扫描线 + 差分 (优化DP)

    4422: [Cerc2015]Cow Confinement Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 61  Solved: 26[Submi ...

  2. 【poj3263】 Tallest Cow

    http://poj.org/problem?id=3263 (题目链接) 题意 n头奶牛排成一排,最高的一头I身高H,给出R个条件(a,b),表示a,b之间的奶牛都要比a矮,b的身高大于等于a.求每 ...

  3. 在网页上添加QQ消息代码

    进入:http://shang.qq.com/v3/widget.html 复制代码 到网页

  4. 数据结构算法C语言实现(十四)--- 4.1&4.2串的类型定义、表示及实现

    一.简述 [暂无] 二.头文件 //4_2_part1.h /** author:zhaoyu */ //2016-6-10 //----串的定长顺序存储表示---- #include "h ...

  5. 数据结构算法C语言实现(四)---2.3循环链表与双向链表

    一.简述 [工作中...]

  6. pythong中字符串strip的用法

    strip的用法是去除字符串中前后两端的xx字符,xx是一个字符数组,并不是去掉“”中的字符串, 数组中包含的字符都要在字符串中去除.默认去掉空格,lstrip则是去掉左边的,rstrip是右边的 见 ...

  7. Deep Learning in NLP (一)词向量和语言模型

    原文转载:http://licstar.net/archives/328 Deep Learning 算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果.关于这 ...

  8. BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution

    权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...

  9. JS-节点属性(常用!)

    (开始很生疏,不想看的知识点,后来DOM中用的特别多,才发现很重要.还有几个点,是比较容易忽略的,值得注意!) <!DOCTYPE html><html> <head&g ...

  10. 9.12 其他样式;JS

    Display 显示block和隐藏none,不占位置Visbility 显示visible和隐藏hidden,占位置Overflow 超出范围 hidden隐藏透明圆角 Js脚本语言(JavaScr ...