题目描述
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。 要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。
输入描述:
输入有多组数据。
每组数据第一行输入n(1<=n<=9),从第二行开始输入两个n阶矩阵。
输出描述:
判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
如果旋转角度的结果有多个,则输出最小的那个。
示例1
输入
3
1 2 3
4 5 6
7 8 9
7 4 1
8 5 2
9 6 3
输出
90
分析
不要看到旋转矩阵就懵了,它没有那么复杂的求任意角度的旋转矩阵,只是0 90 180 270 四种,方方正正的矩阵旋转方方正正的角度而已。这样就只是找旋转前后座标间的关系,就非常简单了,这题没说清楚是按顺时针旋转,否则的话应该不存在270这一答案
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int mat1[11][11], mat2[11][11];
int main()
{
int n;
while (cin>>n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &mat1[i][j]);
bool flag = true;
int angle = -1;
// if 0
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
scanf("%d", &mat2[i][j]);
if (mat2[i][j] != mat1[i][j])flag = false;
}
if (flag == true)angle = 0;
else {
//if 90
flag = true;
for(int i = 0;i<n;i++)
for (int j = 0; j < n; j++)
{
if (mat1[i][j] != mat2[j][n - 1 - i]) { flag = false; break; }
}
if (flag == true) angle = 90;
else {
//if 270
flag = true;
for (int i = 0; i<n; i++)
for (int j = 0; j < n; j++)
{
if (mat1[i][j] != mat2[n-1-j][i]) { flag = false; break; }
}
if (flag == true)angle = 270;
else {
//if 180
flag = true;
for (int i = 0; i<n; i++)
for (int j = 0; j < n; j++)
{
if (mat1[i][j] != mat2[n - 1 - i][n-1-j]) { flag = false; break; }
}
if (flag == true)angle = 180;
else {
angle = -1;
}
}
}
}
printf("%d\n", angle);
}
}