方块转换 transform
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方块转换 transform相关的知识,希望对你有一定的参考价值。
方块转换 transform
【题目描述】:
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。
写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
#1:转90 度:图案按顺时针转90 度.
#2:转180 度:图案按顺时针转180 度.
#3:转270 度:图案按顺时针转270 度.
#4:反射:图案在水平方向翻转(形成原图案的镜像).
#5:组合:图案在水平方向翻转,然后按照#1-#3 之一转换.
#6:不改变:原图案不改变.
#7:无效转换:无法用以上方法得到新图案.
如果有多种可用的转换方法,请选择序号最小的那个.
【输入描述】:
第一行: 单独的一个整数N.
第二行到第N+1 行: N 行每行N 个字符(不是“@”就是“-”);这是转换前的正方形.
第N+2 行到第2*N+1 行: N 行每行N 个字符(不是“@”就是“-”);这是转换后的正方形.
【输出描述】:
单独的一行包括1 到7 之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法.
【样例输入】 |
【样例输出】 |
3 --- @@- @-- |
1 |
【数据范围及描述】:
模拟!模拟!
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=13; 8 int N; 9 char s[maxn][maxn]; 10 char e[maxn][maxn]; 11 char o[maxn][maxn]; 12 13 bool check() 14 { 15 int i,j; 16 for(i=1;i<=N;i++) 17 for(j=1;j<=N;j++) 18 if(o[i][j]!=e[i][j]) return false; 19 return true; 20 } 21 22 bool _1(char p[][maxn]) 23 { 24 int i,j,x,y; 25 for(i=1;i<=N;i++) 26 for(j=1;j<=N;j++) 27 { 28 y=N+1-i; 29 x=j; 30 o[x][y]=p[i][j]; 31 } 32 return check(); 33 } 34 35 bool _2() 36 { 37 _1(s); 38 char tmp[maxn][maxn]; 39 for(int i=1;i<=N;i++) 40 for(int j=1;j<=N;j++) 41 tmp[i][j]=o[i][j]; 42 return _1(tmp); 43 } 44 45 bool _3() 46 { 47 _2(); 48 char tmp[maxn][maxn]; 49 for(int i=1;i<=N;i++) 50 for(int j=1;j<=N;j++) 51 tmp[i][j]=o[i][j]; 52 return _1(tmp); 53 } 54 55 bool _4() 56 { 57 int i,j,x,y; 58 for(i=1;i<=N;i++) 59 for(j=1;j<=N;j++) 60 { 61 x=i; 62 y=N+1-j; 63 o[x][y]=s[i][j]; 64 } 65 return check(); 66 } 67 68 bool _5() 69 { 70 _4(); 71 char tmp[maxn][maxn]; 72 for(int i=1;i<=N;i++) 73 for(int j=1;j<=N;j++) 74 tmp[i][j]=o[i][j]; 75 if(_1(tmp)) return true; 76 else 77 { 78 for(int i=1;i<=N;i++) 79 for(int j=1;j<=N;j++) 80 tmp[i][j]=o[i][j]; 81 if(_1(tmp)) return true; 82 else 83 { 84 for(int i=1;i<=N;i++) 85 for(int j=1;j<=N;j++) 86 tmp[i][j]=o[i][j]; 87 if(_1(tmp)) return true; 88 } 89 } 90 return false; 91 } 92 93 bool _6() 94 { 95 for(int i=1;i<=N;i++) 96 for(int j=1;j<=N;j++) 97 if(s[i][j]!=e[i][j]) return false; 98 return true; 99 } 100 101 int main() 102 { 103 scanf("%d\n",&N); 104 for(int i=1;i<=N;i++) 105 gets(s[i]+1); 106 for(int i=1;i<=N;i++) 107 gets(e[i]+1); 108 int ans; 109 if(_1(s)) ans=1; 110 else if(_2()) ans=2; 111 else if(_3()) ans=3; 112 else if(_4()) ans=4; 113 else if(_5()) ans=5; 114 else if(_6()) ans=6; 115 else ans=7; 116 printf("%d",ans); 117 return 0; 118 }
以上是关于方块转换 transform的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P1205 [USACO1.2]方块转换 Transformations
USACO1.2_2★Transformations 方块转换
洛谷 P1205 [USACO1.2]方块转换 Transformations