枚举+模拟,枚举逆旋90度0/1/2/3次,水平翻转0/1次,竖直翻转0/1次
#include<iostream>
using namespace std;
const int N=15;
int n;
char g[N][N],d[N][N],tmp[N][N];
void copy()
{
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
tmp[i][j]=g[i][j];
}
void ch1()
{
char ch[N][N];
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
ch[j][i]=tmp[i][j];
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
tmp[i][j]=ch[i][j];
}
void ch2()
{
for(int i=0,j=n-1;i<j;++i,--j)
for(int k=0;k<n;++k)
swap(tmp[i][k],tmp[j][k]);
}
void ch3()
{
for(int k=0;k<n;++k)
for(int i=0,j=n-1;i<j;++i,--j)
swap(tmp[k][i],tmp[k][j]);
}
bool equal(char g[][N],char d[][N])
{
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if(g[i][j]!=d[i][j]) return false;
return true;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%s",g[i]);
for(int i=0;i<n;++i)
scanf("%s",d[i]);
bool f=false;
for(int i=0;i<4;++i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
{
copy();
for(int c=0;c<=i;++c)
{
ch1();
for(int a=0;a<=j;++a)
{
ch2();
for(int b=0;b<=k;++b)
{
ch3();
if(equal(tmp,d))
{
f=true;
break;
}
}
}
}
}
if(f) puts("Yes");
else puts("No");
return 0;
}