旋转矩阵 - C++

题目描述

任意输入两个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);

    }
}
点赞