方块转换
描述
一块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
枚举方案就行了,要按顺序检验,用中间数组转换即可
考察算法:模拟/枚举
/*
ID: 保密
PROG: transform
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=15;
int n;
char a[N][N],b[N][N],c[N][N],d[N][N];//c和d是转换时用的中间数组
void change(int x)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
d[i][j]=c[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(x==1)
c[i][j]=d[n-j+1][i];
else
if(x==2)
c[i][j]=d[n-i+1][n-j+1];
else
if(x==3)
c[i][j]=d[j][n-i+1];
else
c[i][j]=d[i][n-j+1];
}
bool pd()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(c[i][j]!=b[i][j])
return false;
return true;
}
int main()
{
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>b[i][j];
for(i=1;i<=4;i++)//1-4种方法
{
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
c[j][k]=a[j][k];
change(i);
if(pd())
{
cout<<i<<endl;
return 0;
}
}
for(i=1;i<=3;i++)//第5种方法
{
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
c[j][k]=a[j][k];
change(4);
change(i);
if(pd())
{
cout<<5<<endl;
return 0;
}
}
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
c[j][k]=a[j][k];
if(pd())///第6种方法
{
cout<<6<<endl;
return 0;
}
cout<<7<<endl;//排除法得出剩下的都是第7种
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。