方块转换
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
1:转90度:图案按顺时针转90度。
2:转180度:图案按顺时针转180度。
3:转270度:图案按顺时针转270度。
4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
6:不改变:原图案不改变。
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之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
SAMPLE INPUT
3 @-@ --- @@- @-@ @-- --@
SAMPLE OUTPUT
1
题解:
首先,这不是广度优先搜索,难度系数就降了好多。
另外需要记得的结论就是:
设a[][]是原图,b[][]是转换后的图。
若旋转90度,则a[i][j]==b[j][n-i+1];
由此若旋转180度以及270度可以递推。
若是反射,则a[i][j]==a[i][n-j+1];
代码实现:
View Code
1 /*
2 ID:10239512
3 PROG:transform
4 LANG:C++
5 */
6
7 #include<iostream>
8 #include<fstream>
9 using namespace std;
10 ifstream fin("transform.in");
11 ofstream fout("transform.out");
12
13 int n;char a[11][11],b[11][11],c[11][11];
14
15 int xuanzhuan(char a[][11],char b[][11],int k){
16 int i,j;
17 int result1=k;
18 for(i=1;i<=n;i++)
19 {
20 for(j=1;j<=n;j++)
21 {
22 switch(k)
23 {
24 case 1:
25 if(a[i][j]!=b[j][n+1-i])
26 result1=7;break;
27 case 2:
28 if(a[i][j]!=b[n+1-i][n+1-j])
29 result1=7;break;
30 case 3:
31 if(a[i][j]!=b[n+1-j][i])
32 result1=7;break;
33 case 4:
34 if(a[i][j]!=b[i][n+1-j])
35 result1=7;break;
36 }
37 if(result1!=k) return result1;
38 }
39 }
40 return result1;
41 }
42
43 void Mirror(){
44 int i,j;
45 for(i=1;i<=n;i++)
46 for(j=1;j<=n;j++)
47 c[i][n-j+1]=a[i][j];
48 }
49
50 int check(){
51 int i,j;
52 int result1=6;
53 for(i=1;i<=n;i++)
54 for(j=1;j<=n;j++)
55 if(a[i][j]!=b[i][j])
56 {result1=7;return result1;}
57 return result1;
58 }
59
60 void Init(){
61 int i,j;
62 fin>>n;
63 for(i=1;i<=n;i++)
64 for(j=1;j<=n;j++)
65 fin>>a[i][j];
66 for(i=1;i<=n;i++)
67 for(j=1;j<=n;j++)
68 fin>>b[i][j];
69 }
70
71 int main()
72 {
73 int i,j,result=0;
74
75 for(i=1;i<=4;i++)
76 {
77 result=xuanzhuan(a,b,i);
78 if(result==i)
79 {fout<<result<<endl;return 0;}
80 }
81
82 Mirror();
83 for(i=1;i<=3;i++)
84 {
85 result=xuanzhuan(c,b,i);
86 if(result==i)
87 {fout<<5<<endl;return 0;}
88 }
89
90 result=check();
91 fout<<result<<endl;
92 return 0;
93 }