CFgym Board Queries (旋转、翻转简化)
2014-10-04 01:34
260 查看
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题
Board Queries
题意:给出一个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血,我自己都怕。
代码:
View Code
另外输入的好莱森是垂直翻转,另一个是水平翻转……看来英文的说法和汉语不太一样?
codeforces
2014-2015 CT S02E04: Codeforces Trainings Season 2 Episode 4 (US College Rockethon 2014 + COCI 2008-5 + GCJ Finals 2008 C)
D题
Board Queries
题意:给出一个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=1111; int n,m; char a[maxn][maxn]; char s[22]; int ro,mr[2]; inline void gank(int &x,int &y) { int tx,i; if(mr[0]==1){ x=n-x+1; } if(mr[1]==1){ y=n-y+1; } FOR(i,1,ro){ tx=n-y+1; y=x; x=tx; } } inline void mir(const int &q) { mr[q]^=1; } inline void rot(const int &q) { ro+=q+4; ro%=4; swap(mr[0],mr[1]); } inline void init() { ro=0; mz(mr); } int main() { char c; int x,y,i,j,k; while(RD2(n,m)!=EOF) { FOR(i,1,n) { FOR(j,1,n) { a[i][j]='.'; } } init(); FOR(i,1,m) { scanf(" %s",s); if(s[1]=='O') { ///ROTATE scanf(" %s",s); if(s[1]=='W') { ///CW rot(1); } else { ///CCW rot(-1); } } else if(s[1]=='I') { ///MIRROR scanf(" %s",s); if(s[0]=='H') { ///HOR-¡ü¡ý mir(0); } else { ///VER|¡û¡ú mir(1); } } else if(s[1]=='E') { ///REPLACE scanf("%d%d",&x,&y); FOR(k,x,x+2) FOR(j,y,y+2) { 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,1,n) { FOR(j,1,n) { x=i,y=j; gank(x,y); //printf("(%d,%d)",x,y); putchar(a[x][y]); } puts(""); } } }
View Code
另外输入的好莱森是垂直翻转,另一个是水平翻转……看来英文的说法和汉语不太一样?
相关文章推荐
- 翻转单词顺序 VS 左旋转字符串43
- PHP图片处理之图片旋转和图片翻转实例
- 翻转单词顺序VS左旋转字符串
- Java中Image的水平翻转、缩放与自由旋转操作
- 图片旋转缩放翻转效果
- WPF图片控件的旋转、缩放、翻转
- Python+OpenCV之-1.4.1平移、旋转、缩放、翻转-之实践
- 翻转单词顺序vs左旋转字符串
- 面试题42:翻转单词顺序 VS 左旋转字符串
- php图片处理代码分享,包括缩放、剪裁、缩放、翻转、旋转、透明、锐化等
- 坐标的旋转,翻转
- 剑指offer--面试题42: 翻转单词顺序列 vs 左旋转字符串
- A. DZY Loves Chessboard (CF)
- cf 的gym里的题目2016-2017 CT S03E03:
- Matlab与线性代数 -- 矩阵的左右翻转、上下翻转和矩阵的逆时针旋转90操作
- 【OpenCV学习笔记】【编程实例】二(图像的旋转和翻转)
- uvalive7040 / cf gym 100548 Color(2014西安区域赛F题)
- 一个用来翻转、旋转的矩阵类
- 图片(旋转/缩放/翻转)变换效果(ccs3/滤镜/canvas)(转)
- 数字图像处理--通过矩阵,简化操作(旋转,平移,缩放,切边....)