题意:
题意:给定两个n*n(1<=n<=10)的矩阵,通过1-7的操作是否能使两个矩阵相同,输出序号小的操作。
1、顺时针旋转90度
2、顺时针旋转180度
3、顺时针旋转270度
4、轴对称
5、轴对称后进行一次1-3的操作
6、不做操作
7、无法通过上面的操作得到
题解:
相当于只有顺时针旋转和轴对称两种操作。
注意: 输出最小序号
/*
ID:jsntrdy1
PROG: transform
LANG: C++
*/
#include<cstdio>
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("transform.in");
ofstream fout("transform.out");
const int N=11;
int n;
char mat[N][N];
char matc[N][N];
char temp[N][N];
void rotate()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
temp[i][j]=mat[n+1-j][i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mat[i][j]=temp[i][j];
}
void reflect()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
temp[i][j]=mat[i][n+1-j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mat[i][j]=temp[i][j];
}
bool isOK()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mat[i][j]!=matc[i][j])
return false;
return true;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>mat[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>matc[i][j];
bool flag=false;
if(isOK())
{
flag=true;
}
//判断1~3
for(int i=0;i<3;i++)
{
rotate();
if(isOK())
{
fout<<i+1<<endl;
return 0;
}
}
//旋转360 回到原位
rotate();
reflect();
if(isOK())
{
fout<<'4'<<endl;
return 0;
}
for(int i=0;i<3;i++)
{
rotate();
if(isOK())
{
fout<<'5'<<endl;
return 0;
}
}
if(flag)
fout<<'6'<<endl;
else
fout<<'7'<<endl;
return 0;
}