USACO 1.2.2 Transformations 方块转换

Description

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度。 2:转180度:图案按顺时针转180度。 3:转270度:图案按顺时针转270度。 4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。 5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。 6:不改变:原图案不改变。 7:无效转换:无法用以上方法得到新图案。 如果有多种可用的转换方法,请选择序号最小的那个。

Input

第一行: 单独的一个整数N。 第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。 第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。

Output

单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

Sample Input

3 
@-@ 
--- 
@@- 
@-@ 
@-- 
--@ 

Sample Output

1 


题目意思:问原先的正方形图案通过那一种转换变成了目标正方形图案。
解题思路:一共有七种变换,但究其本质实际上只有旋转,反射,不变,和其他这四种方案,那么把这四种方案写成被调函数。我们只需要不断枚举这七种变换,和目标正方形图案坐标比对即可。
  1 #include<cstdio>
  2 #include<stdio.h>
  3 #include<cstring>
  4 #include<algorithm>
  5 int n;
  6 int vis[8];
  7 char a[11][11],b[11][11],c[11][11],t[11][11];
  8 void turn_90()
  9 {
 10     int i,j;
 11     for(i=0; i<n; i++)
 12     {
 13         for(j=0; j<n; j++)
 14         {
 15             b[j][n-i-1]=c[i][j];
 16         }
 17     }
 18     for(i=0; i<n; i++)
 19     {
 20         strcpy(c[i],b[i]);
 21     }
 22 }
 23 void fanshe()
 24 {
 25     int i,j;
 26     for(i=0; i<n; i++)
 27     {
 28         for(j=0; j<n; j++)
 29         {
 30             b[i][n-j-1]=a[i][j];
 31         }
 32     }
 33     for(i=0; i<n; i++)
 34     {
 35         strcpy(c[i],b[i]);
 36     }
 37 }
 38 void no_ex()
 39 {
 40     int i,j;
 41     for(i=0; i<n; i++)
 42     {
 43         for(j=0; j<n; j++)
 44         {
 45             b[i][j]=a[i][j];
 46         }
 47     }
 48 }
 49 int judge(int k)
 50 {
 51     int i,j;
 52     int flag=1;
 53     for(i=0; i<n; i++)
 54     {
 55         for(j=0; j<n; j++)
 56         {
 57             if(t[i][j]!=b[i][j])///不成立
 58             {
 59                 flag=0;
 60             }
 61         }
 62     }
 63     return flag;
 64 }
 65 int main()
 66 {
 67     int i,j,k;
 68     scanf("%d",&n);
 69     for(i=0; i<n; i++)
 70     {
 71         for(j=0; j<n; j++)
 72         {
 73             scanf(" %c",&a[i][j]);
 74             c[i][j]=a[i][j];
 75         }
 76     }
 77     for(i=0; i<n; i++)
 78     {
 79         for(j=0; j<n; j++)
 80         {
 81             scanf(" %c",&t[i][j]);
 82         }
 83     }
 84     for(k=1; k<=3; k++)///旋转
 85     {
 86         turn_90();///在旋转90基础上再旋转90就是180,再旋转90就是270
 87         if(judge(k))
 88         {
 89             printf("%d\n",k);
 90             return 0;
 91         }
 92     }
 93     fanshe();
 94     if(judge(4))
 95     {
 96         printf("4\n");
 97         return 0;
 98     }
 99     for(k=1; k<=3; k++)
100     {
101         turn_90();
102         if(judge(5))
103         {
104             printf("5\n");
105             return 0;
106         }
107     }
108     no_ex();
109     if(judge(6))
110     {
111         printf("6\n");
112         return 0;
113     }
114     else
115     {
116         printf("7\n");
117     }
118     return 0;
119 }

 



posted @ 2018-09-19 23:23  王陸  阅读(616)  评论(0编辑  收藏  举报