/*
ID : jakeylee11
PROG : transform
LANG : C++
*/
#include <fstream>
using namespace std ;
int i , j , k ;
char p[20][20] ; //p是原图案
char q[20][20] ; //q是转换后的图案
char tmp[20][20] ;
int sub( int n )
{
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( tmp[i][j] != q[j][n-1-i] )
{
goto state2 ;
}
}
}
return 1 ;
state2 :
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( tmp[i][j] != q[n-1-i][n-1-j] )
{
goto state3 ;
}
}
}
return 2 ;
state3 :
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( tmp[i][j] != q[n-1-j][i] )
{
return 0 ;
}
}
}
return 3 ;
}
int fun( int n )
{
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( p[i][j] != q[j][n-1-i] )
{
goto state2 ;
}
}
}
return 1 ;
state2 :
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( p[i][j] != q[n-1-i][n-1-j] )
{
goto state3 ;
}
}
}
return 2 ;
state3 :
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( p[i][j] != q[n-1-j][i] )
{
goto state4 ;
}
}
}
return 3 ;
state4 :
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( p[i][j] != q[i][n-1-j] )
{
goto state5 ;
}
}
}
return 4 ;
state5 :
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
tmp[i][n-1-j] = p[i][j] ;
}
}
if ( sub( n ) )
{
return 5 ;
}
for ( i = 0 ; i < n ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( p[i][j] != q[i][j] )
{
return 7 ;
}
}
}
return 6 ;
}
int main()
{
ifstream fin("transform.in") ;
ofstream fout("transform.out") ;
int n ;
fin >> n ;
for ( i = 0 ; i < n ; i++ )
{
fin >> p[i] ;
}
for ( i = 0 ; i < n ; i++ )
{
fin >> q[i] ;
}
fout << fun( n ) << endl ;
return 0 ;
}
//----------------------------------分割线-------------------------------------//
//坑爹啊,其实题目不难,但是解起来挺久的,唉,我什么算法都没用,直接求,很笨的方法。中间竟然卡在函数调用,是因为我把图案用二维字符数组表示,然后函数调用是二维数组的参数怎么传递老是出错。妹的,还用刚开始还想用动态的创建二位字符数组,但是也因为后来函数调用时参数的问题,改成普通二维字符数组算了,放全局范围算了,这样就没有函数参数的问题了,直接用,但是这种方法在做大点的程序时肯定不行的。mark........以后再研究