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:
3
@-@
---
@@-
@-@
@--
--@
输出样例#1:
1
说明
题目翻译来自NOCOW。
这个题其实可以输入循环中就能把答案求出来,但是因为这个题比较简单,为了复习一下函数传二维数组的方法。比较好写,写一个旋转90°的函数,180就是旋转两次,270就是3次。然后镜像什么的再求也就容易很多。
下面是AC代码
#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;
}