题意:
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
1:转90度:图案按顺时针转90度。
2:转180度:图案按顺时针转180度。
3:转270度:图案按顺时针转270度。
4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
6:不改变:原图案不改变。
7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
只使用1--7中的一个步骤来完成这次转换。
题解:按题意每个试
代码:
/*
ID: lishicao
PROG: transform
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std ;
ifstream fin ( "transform.in" ) ;
ofstream fout ( "transform.out" ) ;
int N ;
char map[12][12] , trans[12][12] , temp[12][12] ;
bool check()
{
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ )
if( temp[i][j] != trans[i][j] ) return false ;
return true ;
}
void Rotation()
{
char tmp[12][12] ;
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ )
tmp[j][N-1-i] = temp[i][j] ;
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ )
temp[i][j] = tmp[i][j] ;
}
void Reflection()
{
char tmp[12][12] ;
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ )
tmp[i][N-1-j] = temp[i][j] ;
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ )
temp[i][j] = tmp[i][j] ;
}
int main()
{
int flag = 0 ;
char tmp[12][12] ;
fin >> N ;
for( int i = 0 ; i < N ; i ++ )
fin >> map[i] ;
for( int i = 0 ; i < N ; i ++ )
fin >> trans[i] ;
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ ) {
temp[i][j] = map[i][j] ;
tmp[i][j] = map[i][j] ;
}
// 1 2 3
for( int i = 1 ; i <= 3 ; i ++ ) {
Rotation() ;
if( !flag && check() )
{
flag = 1 ;
fout << i << endl ;
}
}
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ )
temp[i][j] = map[i][j] ;
// 4 5
Reflection() ;
if( !flag && check() )
{
flag = 1 ;
fout << 4 << endl ;
}
for( int i = 1 ; i <= 3 ; i ++ )
{
Rotation() ;
if( !flag && check() )
{
flag = 1 ;
fout << 5 << endl ;
}
}
for( int i = 0 ; i < N ; i ++ )
for( int j = 0 ; j < N ; j ++ )
temp[i][j] = map[i][j] ;
// 6
if( !flag && check() )
{
flag = 1 ;
fout << 6 << endl ;
}
// 7
if( !flag ) fout << 7 << endl ;
return 0 ;
}