旋转矩阵-牛客网#

题目描述

任意输入两个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
//看这个我都懵了,一开始觉得很简单,就是看下标变化的规律,但是比如90°,(0,0)->(0,k-1)但是(k-1,0)->(0,0)感觉行和列没有任何的这个规律可循,难道是看行的变化规律
然后行内再看列的变化规律?最讨厌着规律了就是找不到。
//代码来自于:https://blog.csdn.net/wangyulinyy/article/details/9746113
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <algorithm>
 
using namespace std;
int a[10][10], b[10][10], c[10][10];
void clm(int a[10][10], int c[10][10], int n)
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
            c[i][j] = a[n-1-j][i];
    }
}
int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
        scanf("%d", &a[i][j]);
        for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
        scanf("%d", &b[i][j]);
        bool flag;
        for(int i=0; i<=3; i++)
        {
            if(i == 0)
            {
                flag = true;
                for(int i=0; i<n && flag; i++)
                for(int j=0; j<n && flag; j++)
                if(a[i][j] != b[i][j]) 
                { flag = false; break;}
                if(flag) 
                {
                    printf("0\n");
                    break;
                }
            }
            else if(i == 1)
            {
                clm(a,c,n);
                flag = true;
                for(int i=0; i<n && flag; i++)
                for(int j=0; j<n && flag; j++)
                if(c[i][j] != b[i][j]) 
                { flag = false; break;}
                if(flag) 
                {
                    printf("90\n");
                    break;
                }
            }
            else if(i == 2)
            {
                clm(c,a,n);
                flag = true;
                for(int i=0; i<n && flag; i++)
                for(int j=0; j<n && flag; j++)
                if(a[i][j] != b[i][j]) 
                { flag = false; break;}
                if(flag) 
                {
                    printf("180\n");
                    break;
                }
            }
            else if(i == 3)
            {
                clm(a,c,n);
                flag = true;
                for(int i=0; i<n && flag; i++)
                for(int j=0; j<n && flag; j++)
                if(c[i][j] != b[i][j]) 
                { flag = false; break;}
                if(flag) 
                {
                    printf("270\n");
                    break;
                }
            }
        }
        if(!flag) printf("-1\n");
    }
system("pause");
return 0;
}

//这个函数就是顺时针旋转90度的,厉害,这样如果一次旋转不行的话,那么就两次180,三次270度。使用a和c进行替换,判断与b是否相等。

 
    

猜你喜欢

转载自www.cnblogs.com/BlueBlueSea/p/9282611.html