『算法-ACM竞赛-USACO』 Training Section 1.2 [USACO1.2]方块转换 Transformations

『算法-ACM 竞赛-USACO』 Training Section 1.2 [USACO1.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 中的一个步骤来完成这次转换。

输入输出格式
输入格式:
第一行: 单独的一个整数 N。

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

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

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

输入输出样例
输入样例#1:

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

输出样例#1:
1
说明
题目翻译来自 NOCOW。

这个题其实可以输入循环中就能把答案求出来,但是因为这个题比较简单,为了复习一下函数传二维数组的方法。比较好写,写一个旋转 90° 的函数,180 就是旋转两次,270 就是 3 次。然后镜像什么的再求也就容易很多。
下面是 AC 代码

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
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
char ob[11][11];
char ob2[11][11];
char obj1[11][11];
char obj2[11][11];
char obj3[11][11];
char obj4[11][11];
char obj5[11][11];
char obj6[11][11];
char obj7[11][11];
int n;
void zh(char a[][11],char b[][11]);
bool db(char a[][11],char b[][11]);
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
scanf(" %c",&ob[i][j]);
obj4[i][n+1-j]= ob[i][j];
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf(" %c",&ob2[i][j]);
zh(ob,obj1);
zh(obj1,obj2);
zh(obj2,obj3);
zh(obj4,obj5);
zh(obj5,obj6);
zh(obj6,obj7);
if(db(ob2,obj1) )cout<<1<<endl;
else if(db(ob2,obj2) )cout<<2<<endl;
else if(db(ob2,obj3) )cout<<3<<endl;
else if(db(ob2,obj4) )cout<<4<<endl;
else if(db(ob2,obj5) )cout<<5<<endl;
else if( db(ob2,obj6) )cout<<5<<endl;
else if( db(ob2,obj7) )cout<<5<<endl;
else if(db(ob2,ob) )cout<<6<<endl;
else cout<<7<<endl;
return 0;
}

void zh(char a[][11],char b[][11])
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
b[i][j]=a[n+1-j][i];
}
}
bool db(char a[][11],char b[][11])
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if(b[i][j]!=a[i][j])
return 0;
}
return 1;
}

『算法-ACM竞赛-USACO』 Training Section 1.2 [USACO1.2]方块转换 Transformations
https://chiamzhang.github.io/2024/06/29/『算法-ACM竞赛-USACO』 Training Section 1.2 [USACO1.2]方块转换 Transformations/
Author
Chiam
Posted on
June 29, 2024
Licensed under