题目描述

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

1:转90度:图案按顺时针转90度。

2:转180度:图案按顺时针转180度。

3:转270度:图案按顺时针转270度。

4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。

5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。

6:不改变:原图案不改变。

7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

只使用1—7中的一个步骤来完成这次转换。

输入输出格式

输入格式:

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

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

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

输出格式:

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

输入输出样例

输入样例#1:

1
2
3
4
5
6
7
3
@-@
---
@@-
@-@
@--
--@

输出样例#1:

1
1

代码

一道纯模拟的好题。考察的就是是否细心。

写了100+行,应该……还算清晰明了吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>

using namespace std;
const int maxn=15;
int n;
char a[maxn][maxn],b[maxn][maxn],t[maxn][maxn];
bool check(char a[15][15],char b[15][15]) {
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=a[i][j])
return false;
return true;
}
void clear() {
memset(t,0,sizeof(t));
}
void Get_Data() {
cin>>n;
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];
}
void debug(char a[15][15]) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
void c1() {
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[j][n-i+1]=a[i][j];
//debug(t);
if(check(b,t)) {cout<<1;exit(0);}
}
void c2() {
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[n-i+1][n-j+1]=a[i][j];
//debug(t);
if(check(b,t)) {cout<<2;exit(0);}
}
void c3() {
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[n-j+1][i]=a[i][j];
//debug(t);
if(check(b,t)) {cout<<3;exit(0);}
}
void c4() {
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=a[i][n-j+1];
//debug(t);
if(check(b,t)) {cout<<4;exit(0);}
}
void c5() {
bool ok=false;
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=a[i][n-j+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=t[i][j];
//Try C1
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[j][n-i+1]=a[i][j];
if(check(b,t)) ok=true;
//Try C2
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[n-i+1][n-j+1]=a[i][j];
if(check(b,t)) ok=true;
//Try C3
clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[n-j+1][i]=a[i][j];
if(check(b,t)) ok=true;
if(ok) {cout<<5;exit(0);}
}
void c6() {
if(check(a,b)) {cout<<6;exit(0);}
}
int main() {
Get_Data();
c1();c2();c3();c4();c5();c6();
cout<<7;
return 0;
}