您的位置:首页 > 其它

USACO - Chapter1 Section 1.2 - Transformations

2017-05-13 13:36 513 查看
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

本题利用了一些格式规整的范式来进行矩阵的变换和处理,将复杂、重复性高的部分放入几个函数中完成,按照顺序一个个进行检验。

Code

#include<iostream>
#include<cmath>
using namespace std;
int n,i,j,k=1,temp;//k用于标记序号
bool sc = false;
bool a[11][11]={0},b[11][11]={0};//a原正方形,b转换后正方形
char ch;
void image_by_inversion()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n/2;j++)
{
temp=a[i][j];
a[i][j]=a[i][n-j+1];
a[i][n-j+1]=temp;
}
}
void rotate90()
{
int m[11][11];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
m[j][n-i+1]=a[i][j];//旋转
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=m[i][j];//返回正方形
}
void judgement()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a[i][j]!=b[i][j])
return;
cout <<k <<endl;
exit(0); // 直接退出main 此处不可以写 return
}
int main()
{
cin>>n;
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
cin>>ch;
if (ch=='@') a[i][j]=1;
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
cin>>ch;
if (ch=='@') b[i][j]=1;
}
}
rotate90();judgement();k++;
rotate90();judgement();k++;
rotate90();judgement();k++;
rotate90();

image_by_inversion();judgement();k++;
rotate90();judgement();
rotate90();judgement();
rotate90();judgement();k++;
rotate90();

image_by_inversion();
judgement();
cout<<"7"<<endl;//没找到,直接输出7
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: