描述
一块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
#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;
ifstream cin("transform.in");
ofstream cout("transform.out");
int a[20][20];
int b[20][20];
int c[20][20];
int d[20][20];
int n;
void shun() 顺时针旋转90度
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[j][n-i+1]=c[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c[i][j]=d[i][j];
}
}
}
void fan() 水平翻转
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[i][n+1-j]=c[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c[i][j]=d[i][j];
}
}
}
int pi() 看与答案是否匹配
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(c[i][j]!=b[i][j]) return 0;
}
}
return 1;
}
int main()
{
char x;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>x;
if(x=='@') {a[i][j]=1;c[i][j]=1;}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>x;
if(x=='@') b[i][j]=1;
}
}
shun();
if(pi()) {cout<<"1"<<endl;return 0;}
shun();
if(pi()) {cout<<"2"<<endl;return 0;}
shun();
if(pi()) {cout<<"3"<<endl;return 0;}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c[i][j]=a[i][j];
}
}
fan();
if(pi()) {cout<<"4"<<endl;return 0;}
shun();
if(pi()) {cout<<"5"<<endl;return 0;}
shun();
if(pi()) {cout<<"5"<<endl;return 0;}
shun();
if(pi()) {cout<<"5"<<endl;return 0;}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c[i][j]=a[i][j];
}
}
if(pi()) {cout<<"6"<<endl;return 0;}
cout<<"7"<<endl;
//system("pause");
return 0;
}
这题就是一个数学题
自己推公式
本人喜欢用函数
因为函数更方便
还有的是根本不用字符
有1和0代替即可