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
    ****************************************************************/
    


    编程算法爱好者。
  • 相关阅读:
    mysql 设置密码
    linux 下如何抓取HTTP流量包(httpry)
    m2a-vm超频的方法
    生产服务器环境最小化安装后 Centos 6.5优化配置备忘
    CentOS关闭休眠和屏保模式
    微信公众平台开发教程第2篇-----微信开发者接入
    微信公众平台开发教程第1篇-新手解惑
    android 文件读取(assets、raw)
    员工培训的七大误区和三个内核价值
    从业务专家进阶到管理者
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083863.html
Copyright © 2011-2022 走看看