usaco1.2.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: transform

INPUT FORMAT:

(file transform.in)

第一行: 单独的一个整数N。

第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。

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

OUTPUT FORMAT:

(file transform.out)

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

样例输入

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

样例输出

1


没什么好说的

无非就是判断各种情况以后

不能的就返回false

成功的就true

 1 /*
 2 ID:i_goodboy1
 3 LANG:C++
 4 TASK:transform
 5 */
 6 #include <cstdio>
 7 #include <iostream>
 8 #include <cstring>
 9 using namespace std;
10 int n;
11 char s[15][15],t[15][15],o[15][15];
12 void read()
13 {
14     scanf("%d",&n);
15     for(int a=1;a<=n;a++)
16         scanf("%s",s[a]+1);
17     for(int a=1;a<=n;a++)
18         scanf("%s",t[a]+1);
19 }
20 bool right90()
21 {
22     for(int a=1;a<=n;a++)
23         for(int b=1;b<=n;b++)
24             if(s[n-b+1][a]!=t[a][b])
25                 return false;
26     return true;
27 }
28 bool right180()
29 {
30     for(int a=1;a<=n;a++)
31         for(int b=1;b<=n;b++)
32             if(s[a][b]!=t[n-a+1][n-b+1])
33                 return false;
34     return true;
35 }
36 bool left90()
37 {
38     for(int a=1;a<=n;a++)
39         for(int b=1;b<=n;b++)
40             if(s[a][b]!=t[n-b+1][a])
41                 return false;
42     return true;
43 }
44 bool mirror()
45 {
46     for(int a=1;a<=n;a++)
47         for(int b=1;b<=n;b++)
48             if(s[a][b]!=t[a][n-b+1])
49                 return false;
50     return true;
51 }
52 bool notchange()
53 {
54     for(int a=1;a<=n;a++)
55         for(int b=1;b<=n;b++)
56             if(s[a][b]!=t[a][b])
57                 return false;
58     return true;
59 }
60 bool changeand123()
61 {
62     memcpy(o,t,sizeof(t));
63     for(int a=1;a<=n;a++)
64         for(int b=1;b<=n;b++)
65             t[a][b]=o[a][n-b+1];
66     if(right90())
67         return true;
68     else if(right180())
69         return true;
70     else if(left90())
71         return true;
72     else
73         return false;
74 }
75 void solve()
76 {
77     if(right90())
78         cout<<1<<endl;
79     else if(right180())
80         cout<<2<<endl;
81     else if(left90())
82         cout<<3<<endl;
83     else if(mirror())
84         cout<<4<<endl;
85     else if(notchange())
86         cout<<6<<endl;
87     else if(changeand123())
88         cout<<5<<endl;
89     else
90         cout<<7<<endl;
91 }
92 int main()
93 {
94     freopen("transform.in","r",stdin);
95     freopen("transform.out","w",stdout);
96     read();
97     solve();
98     return 0;
99 }

 

posted @ 2015-11-21 11:35  HELLO----WORLD  阅读(187)  评论(0)    收藏  举报