懵逼的矩阵旋转,整了一个早上,终于整理清楚了。
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。 要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。
看看代码先
#include<iostream>
using namespace std;
int main()
{
int n;
int i,j;
while(cin>>n)
{
int a[9][9],b[9][9];
for(i=0;i<n;i++) /**录入矩阵的值*/
for(j=0;j<n;j++)
cin>>a[i][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>b[i][j];
int flag[4]={1,1,1,1}; /**标记0,90,180,270四个方向*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
/* if(b[i][j]!=a[i][j]) flag[0]=0;
if(b[i][j]!=a[n-1-j][i]) flag[1]=0;
if(b[i][j]!=a[n-1-i][n-1-j]) flag[2]=0;
if(b[i][j]!=a[j][n-1-i] ) flag[3]=0;*/
if(a[i][j]!=b[i][j]) flag[0]=0;
if(a[i][j]!=b[j][n-1-i]) flag[1]=0;
if(a[i][j]!=b[n-1-i][n-1-j]) flag[2]=0;
if(b[i][j]!=a[j] [n-1-i]) flag[3]=0;
}//厉害了,旋转矩阵首先得确定那个是旋转的,那个是旋转后的~
if (flag[0] == 1)
cout << "0" << endl;
else if (flag[1] == 1)
cout << "90" << endl;
else if (flag[2] == 1)
cout << "180" << endl;
else if (flag[3] ==1)
cout << "270" << endl;
else
cout << -1 << endl;
}
return 0;
}
. .
添加笔记
a为旋转前的矩阵,b为旋转后的矩阵。
核心代码思想:
if(b[i][j]!=a[i][j]) flag[0]=0;
if(b[i][j]!=a[n-1-j][i]) flag[1]=0;
if(b[i][j]!=a[n-1-i][n-1-j]) flag[2]=0;
if(b[i][j]!=a[j][n-1-i] ) flag[3]=0;
// 将b逆时针旋转0、90、180、270得到a的表达式进行比较。
if(a[i][j]!=b[i][j]) flag[0]=0;
if(a[i][j]!=b[j][n-1-i]) flag[1]=0;
if(a[i][j]!=b[n-1-i][n-1-j]) flag[2]=0;
if(b[i][j]!=a[j] [n-1-i]) flag[3]=0; a[i][j]!=b[n-1-j][i];
// 将a顺时针旋转0、90、180、270得到b的表达式进行比较。
下图为a顺时针旋转到b的分析过程