您的位置:首页 > 其它

USACO--1.2 Transformations

2014-07-30 20:18 363 查看

USACO--1.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中的一个步骤来完成这次转换。

格式

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


纯模拟,不过我写的太复杂了,建议参考。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
const int M=15;
int ts[M][M];
int n;
bool q=false;
bool z=false;
bool x=false;
bool y=false;
bool check(char c[M][M], char b[M][M])
{
bool flag=true;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
{
if (c[i][j]!=b[i][j])
{flag=false;break;}
}
if (flag) return true;
else return false;
}
void seven()
{
cout<<7<<endl;
z=true;
return;
}
void six(char a[M][M], char b[M][M])
{
if (check(a,b))
{
cout<<6<<endl;
z=true;
return;
}
}

int four(char a[M][M], char b[M][M], char c[M][M])
{
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
c[i][n-j+1]=a[i][j];
if(check(c,b))
{
cout<<"4"<<endl;
z=true;
return 0;
}
else {
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
ts[i][j]=c[i][j];
return 0;
}
}
void three(char a[M][M], char b[M][M], char c[M][M])
{
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
c[n-j+1][i]=a[i][j];
if (check(c,b) && !q)
{
cout<<"3"<<endl;
z=true;
return;

}
else if(x && check(c,b))
{
cout<<"5"<<endl;
z=true;
y=true;
return;
}
}
void two(char a[M][M], char b[M][M], char c[M][M])
{
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
c[n-i+1][n-j+1]=a[i][j];
if (check(c,b) && !q)
{
cout<<"2"<<endl;
z=true;
return;
}
else if(x && check(c,b)){
cout<<"5"<<endl;
z=true;
y=true;
return;
}
}
void one(char a[M][M], char b[M][M], char c[M][M])
{
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
c[j][n-i+1]=a[i][j];
if (check(c,b) && !q)
{
cout<<"1"<<endl;
z=true;
return;
}
else if (x && check(c,b) ){
cout<<"5"<<endl;
z=true;
y=true;
return;
}
}
void five(char a[M][M], char b[M][M], char c[M][M])
{
x=true;
q=true;
four(a,b,c);
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
a[i][j]=ts[i][j];
one(a,b,c);
if (y) return;
two(a,b,c);
if (y) return;
three(a,b,c);
if (y) return;
}
void init()
{
char a[M][M];
char b[M][M];
char c[M][M];
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];
int k;
one(a,b,c);
if (z) return;
two(a,b,c);
if (z) return;
three(a,b,c);
if (z) return;
k=four(a,b,c);
if (z) return;
five(a,b,c);
if (z) return;
six(a,b);
if (z) return;
seven();
}
int main()
{
scanf("%d",&n);
init();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: