解题思路:
1.由题可得,判断两个字符数组a和b,a是通过哪种方式变成b的,一共有4种变换方式,第一种为顺时针旋转90度,第二种为逆时针旋转90度,第三种为围绕中央元素互换,第四种为原样输出
2.在前两道题中,已经讲过如何将一个矩阵通过某种方式旋转,只要判断转置后的行列标号即可,此题同样的方法
3.比较麻烦的是在挨个元素遍历过程中,b数组的行列编号要重新利用x和y分别来代表,即判断a[i][j]==b[x][y],注意x和y每次的增加,并且判断完一次后,行列和标记重新初始化
#include<bits/stdc++.h>
using namespace std;
char a[15][15],b[15][15];//定义两个字符二维数组,用来比较
int n;
void bianhuan()//定义bianhuan函数,无返回值
{
int x=0,y=0;//x为数组b的行号,y为列号
bool flag=1;//标记两个数组是否一样
for(int j=1;j<=n;j++)//顺时针旋转90度
{
x++;//行号增加
for(int i=n;i>=1;i--)
{
y++;//列号增加
if(a[i][j]!=b[x][y])//如果有一项不相等,则标记
flag=0;
}
y=0;
}
if(flag==1)//判断是否相等,如果相等,输出1,结束程序
{
cout<<1;
return ;
}
x=0;//重新初始化行列和标记
y=0;
flag=1;
for(int j=n;j>=1;j--)//判断逆时针旋转是否相等
{
x++;
for(int i=1;i<=n;i++)
{
y++;
if(a[i][j]!=b[x][y])
flag=0;
}
y=0;
}
if(flag==1)
{
cout<<2;
return ;
}
x=0;
y=0;
flag=1;
for(int i=n;i>=1;i--)//判断是否围绕中央元素互换是
{
x++;
for(int j=n;j>=1;j--)
{
y++;
if(a[i][j]!=b[x][y])
flag=0;
}
y=0;
}
if(flag==1)
{
cout<<3;
return ;
}
flag=1;
for(int i=1;i<=n;i++)//判断是否没有变换
for(int j=1;j<=n;j++)
if(a[i][j]!=b[i][j])
flag=0;
if(flag==1)
{
cout<<4;
return ;
}
cout<<5;//如果以上均不是,则输出5
return ;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];//输入数组a
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>b[i][j];//输入数组b
bianhuan();
return 0;
}