USACO--1.2 Transformations
2014-07-30 20:18
363 查看
USACO--1.2 Transformations
描述
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:1:转90度:图案按顺时针转90度。
2:转180度:图案按顺时针转180度。
3:转270度:图案按顺时针转270度。
4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
6:不改变:原图案不改变。
7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
只使用1--7中的一个步骤来完成这次转换。
格式
PROGRAM NAME: transformINPUT FORMAT:
(file transform.in)
第一行: 单独的一个整数N。
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。
OUTPUT FORMAT:
(file transform.out)
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
SAMPLE INPUT
3 @-@ --- @@- @-@ @-- --@
SAMPLE OUTPUT
1
纯模拟,不过我写的太复杂了,建议参考。
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; const int M=15; int ts[M][M]; int n; bool q=false; bool z=false; bool x=false; bool y=false; bool check(char c[M][M], char b[M][M]) { bool flag=true; for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) { if (c[i][j]!=b[i][j]) {flag=false;break;} } if (flag) return true; else return false; } void seven() { cout<<7<<endl; z=true; return; } void six(char a[M][M], char b[M][M]) { if (check(a,b)) { cout<<6<<endl; z=true; return; } } int four(char a[M][M], char b[M][M], char c[M][M]) { for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) c[i][n-j+1]=a[i][j]; if(check(c,b)) { cout<<"4"<<endl; z=true; return 0; } else { for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) ts[i][j]=c[i][j]; return 0; } } void three(char a[M][M], char b[M][M], char c[M][M]) { for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) c[n-j+1][i]=a[i][j]; if (check(c,b) && !q) { cout<<"3"<<endl; z=true; return; } else if(x && check(c,b)) { cout<<"5"<<endl; z=true; y=true; return; } } void two(char a[M][M], char b[M][M], char c[M][M]) { for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) c[n-i+1][n-j+1]=a[i][j]; if (check(c,b) && !q) { cout<<"2"<<endl; z=true; return; } else if(x && check(c,b)){ cout<<"5"<<endl; z=true; y=true; return; } } void one(char a[M][M], char b[M][M], char c[M][M]) { for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) c[j][n-i+1]=a[i][j]; if (check(c,b) && !q) { cout<<"1"<<endl; z=true; return; } else if (x && check(c,b) ){ cout<<"5"<<endl; z=true; y=true; return; } } void five(char a[M][M], char b[M][M], char c[M][M]) { x=true; q=true; four(a,b,c); for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) a[i][j]=ts[i][j]; one(a,b,c); if (y) return; two(a,b,c); if (y) return; three(a,b,c); if (y) return; } void init() { char a[M][M]; char b[M][M]; char c[M][M]; for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) cin>>a[i][j]; for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) cin>>b[i][j]; int k; one(a,b,c); if (z) return; two(a,b,c); if (z) return; three(a,b,c); if (z) return; k=four(a,b,c); if (z) return; five(a,b,c); if (z) return; six(a,b); if (z) return; seven(); } int main() { scanf("%d",&n); init(); return 0; }
相关文章推荐
- 【USACO-Chapter1-1.2】【模拟】Transformations
- USACO 1.2 Transformations(模拟)
- USACO 1.2 Transformations (用结构体来模拟)
- [USACO1.2]方块转换 Transformations
- USACO Section1.2 Transformations
- USACO 1.2 Transformations (模拟)
- USACO 1.2 Transformations (transform)
- usaco 1.2:Transformations
- USACO 1.2 - Transformations(暴力枚举)
- 【几何翻转】Transformations 方块转换(Usaco_Training 1.2)
- usaco section1.2 Transformations
- usaco 1.2 Transformations(模拟)
- USACO-Section 1.2 Transformations [...]
- USACO 1.2-Transformations
- USACO 1.2 Transformations
- USACO - Chapter1 Section 1.2 - Transformations
- USACO-Section1.2 Transformations [其他]
- 【USACO1.2_2】★Transformations 方块转换
- USACO 1.2 Transformations
- USACO 1.2 Transformations