题目描述
有一块N x N(1<=N<=10)的正方形黑白瓦片的图案,要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下所列转换方法转换成新图案的最小方式:
1:转90度:图案按顺时针转90度。
2:转180度:图案按顺时针转180度。
3:转270度:图案按顺时针转270度。
4:反射:图案在水平方向翻转(从中央沿垂线为中心形成原图案的镜像)。
5:组合:图案在水平方向翻转,然后按照1-3之一转换。
6:不改变:原图案不改变。
7:无效转换:无法用以上方式得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
输入
第一行:单独的一个整数N。
第二行到第N+1行:N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。 第N+2行到第2*N+1行:N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。
输出
单独的一行,包括1到7之间的一个数字(在上文已描述),表明需要将转换前的正方形变为转换后的正方形的转换方法。
样例输入
3
@-@
---
@@-
@-@
@--
--@
样例输出
1
提示
思路:模拟就好了
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
using namespace std;
#define FOU(i,x,y) for(int i=x;i<=y;i++)
#define FOD(i,x,y) for(int i=x;i>=y;i--)
#define MEM(a,val) memset(a,val,sizeof(a))
#define PI acos(-1.0)
const double EXP = 1e-9;
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const ll MINF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
const int N = 1e6+5;
char a[15][15];
char ans[15][15];
int n;
bool solve1(char x[][15])
{
//
char tmp[15][15];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
tmp[j][n-i+1]=x[i][j];
}
}
bool flag=true;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(tmp[i][j]!=ans[i][j])
{
flag=false;
break;
}
}
if(!flag)
break;
}
return flag;
}
bool solve2(char x[][15])
{
char tmp[15][15];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
tmp[n-i+1][n-j+1]=x[i][j];
}
}
bool flag=true;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(tmp[i][j]!=ans[i][j])
{
flag=false;
break;
}
}
if(!flag)
break;
}
return flag;
}
bool solve3(char x[][15])
{
char tmp[15][15];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
tmp[n-j+1][i]=x[i][j];
}
}
bool flag=true;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(tmp[i][j]!=ans[i][j])
{
flag=false;
break;
}
}
if(!flag)
break;
}
return flag;
}
bool solve4(char x[][15])
{
char tmp[15][15];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
tmp[i][j]=x[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n/2;j++)
{
int t=tmp[i][n-j+1];
tmp[i][n-j+1]=tmp[i][j];
tmp[i][j]=t;
}
}
bool flag=true;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(tmp[i][j]!=ans[i][j])
{
flag=false;
break;
}
}
if(!flag)
break;
}
return flag;
}
bool solve5(char x[][15])
{
char tmp[15][15];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
tmp[i][j]=x[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n/2;j++)
{
int t=tmp[i][n-j+1];
tmp[i][n-j+1]=tmp[i][j];
tmp[i][j]=t;
}
}
bool flag1=solve1(tmp);
bool flag2=solve2(tmp);
bool flag3=solve3(tmp);
if(flag1||flag2||flag3)
return true;
else
return false;
}
bool solve6(char x[][15])
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(x[i][j]!=ans[i][j])
return false;
}
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
std::ios::sync_with_stdio(false);
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf(" %c",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf(" %c",&ans[i][j]);
if(solve1(a))
puts("1");
else if(solve2(a))
puts("2");
else if(solve3(a))
puts("3");
else if(solve4(a))
puts("4");
else if(solve5(a))
puts("5");
else if(solve6(a))
puts("6");
else
puts("7");
}
return 0;
}