首页 > 代码库 > 方块转换 transform

方块转换 transform

方块转换 transform

【题目描述】:

一块N x N1<=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 }
View Code

 

方块转换 transform