zoukankan      html  css  js  c++  java
  • 九度OJ 1164:旋转矩阵 (矩阵运算)

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:3188

    解决:1245

    题目描述:

    任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
    要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。

    输入:

    输入有多组数据。
    每组数据第一行输入n(1<=n<=9),从第二行开始输入两个n阶矩阵。

    输出:

    判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。

    如果旋转角度的结果有多个,则输出最小的那个。

    样例输入:
    3
    1 2 3
    4 5 6
    7 8 9
    7 4 1
    8 5 2
    9 6 3
    样例输出:
    90
    来源:
    2008年北京航空航天大学计算机研究生机试真题

    思路:

    递归旋转,判断矩阵是否相同。


    代码:

    #include <stdio.h>
     
    #define M 9
     
    struct point {
        int i;
        int j;
    };
     
    struct point rotate(int n, int i, int j, int degree)
    {
        struct point p;
        p.i = i;
        p.j = j;
        int tmp;
        for (int k=1; k<=degree/90; k++)
        {
            tmp = p.i;
            p.i = p.j;
            p.j = n-1 - tmp;
        }
        return p;
    }
     
    int main(void)
    {
        int n, i, j;
        int a[M][M], b[M][M];
        struct point p;
        int degree;
     
        while (scanf("%d", &n) != EOF)
        {
            for(i=0; i<n; i++)
            {
                for(j=0; j<n; j++)
                    scanf("%d", &a[i][j]);
            }
            for(i=0; i<n; i++)
            {
                for(j=0; j<n; j++)
                    scanf("%d", &b[i][j]);
            }
     
            for (degree = 0; degree < 360; degree += 90)
            {
                for(i=0; i<n; i++)
                {
                    for(j=0; j<n; j++)
                    {
                        p = rotate(n, i, j, degree);
                        if (a[i][j] != b[p.i][p.j])
                            break;
                    }
                    if (j != n && a[i][j] != b[p.i][p.j])
                        break;
                }
                //printf("%d
    ", degree);
                //printf("i=%d, j=%d
    ", i, j);
                if (i == n)
                {
                    printf("%d
    ", degree);
                    break;
                }
            }
            if (degree == 360)
                printf("%d
    ", -1);
        }
     
        return 0;
    }
    /**************************************************************
        Problem: 1164
        User: liangrx06
        Language: C
        Result: Accepted
        Time:0 ms
        Memory:912 kb
    ****************************************************************/
    


    编程算法爱好者。
  • 相关阅读:
    新浪推出开放云计算平台Sina App Engine
    摄像机标定
    Qt开发环境大全
    [转]卡尔曼滤波器
    Qt Creator:跨平台 IDE
    建立交叉编译的Qt/Embeded开发环境
    Linux mmap
    QtCreator在不同平台开发的程序的运行
    粒子滤波概述
    13、几点小结,unsigned long long
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083863.html
Copyright © 2011-2022 走看看