• 九度OJ 1171:C翻转 (矩阵计算)


    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:4649

    解决:1530

    题目描述:

    首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。

    操作类型有四种:  
    1 2 表示:90度,顺时针,翻转4个数  
    1 3 表示:90度,顺时针,翻转9个数  
    2 2 表示:90度,逆时针,翻转4个数  
    2 3 表示:90度,逆时针,翻转9个数 

    输入:

    输入有多组数据。
    每组输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。

    输出:

    输出翻转后的数组。

    样例输入:
    1 2 3 4 5
    6 7 8 9 10
    11 12 13 14 15
    16 17 18 19 20
    21 22 23 24 25
    1 3 1 1
    样例输出:
    11 6 1 4 5
    12 7 2 9 10
    13 8 3 14 15
    16 17 18 19 20
    21 22 23 24 25
    来源:
    2010年北京邮电大学计算机研究生机试真题

    思路:

    总体思路是每次旋转90度,超过就多次旋转。可能犯错的细节较多,多调试。


    代码:

    #include <stdio.h>
     
    #define M 5
     
    struct point {
        int i;
        int j;
    };
     
    struct point rotate(int n, int i, int j, int x, int y, 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 = (x-y) + p.j;
            p.j = (x-1) + (y-1) + n-1 - tmp;
        }
        return p;
    }
     
    int main(void)
    {
        int i, j;
        int d, n, x, y;
        int a[M][M], b[M][M];
        struct point p;
        int degree;
     
        while (scanf("%d", &a[0][0]) != EOF)
        {
            for(i=0; i<M; i++)
            {
                for(j=0; j<M; j++)
                {
                    if (i == 0 && j == 0)
                        continue;
                    scanf("%d", &a[i][j]);
                }
            }
            scanf("%d%d%d%d", &d, &n, &x, &y);
     
            if (d == 1)
                degree = 90;
            else
                degree = 270;
     
            for(i=0; i<M; i++)
            {
                for(j=0; j<M; j++)
                {
                    if (i<x-1 || i>=x-1+n || j<y-1 || j>=y-1+n)
                        b[i][j] = a[i][j];
                    else
                    {
                        p = rotate(n, i, j, x, y, degree);
                        b[p.i][p.j] = a[i][j];
                    }
                }
            }
            //printf("i=%d, j=%d
    ", i, j);
            for(i=0; i<M; i++)
            {
                for(j=0; j<M; j++)
                {
                    if (j != 0)
                        printf(" ");
                    printf("%d", b[i][j]);
                }
                printf("
    ");
            }
        }
     
        return 0;
    }
    /**************************************************************
        Problem: 1171
        User: liangrx06
        Language: C
        Result: Accepted
        Time:0 ms
        Memory:912 kb
    ****************************************************************/
    


    编程算法爱好者。
  • 相关阅读:
    AspNetPager分页控件
    Asp.Net MVC 路由表
    自动检测海岸线,生成海浪网格
    斜坡刷子,一种好用的地形编辑方式
    用NVPerfHud4剖析Farcry的绘制过程
    初学BSP,上一些测试数据
    让游戏通过红蓝立体眼镜展现立体效果
    没有贴图拉伸的陡峭悬崖
    刚刚做的Bloom(伪HDR)效果
    近两个礼拜地图编辑器的一些进展
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083856.html
Copyright © 2020-2023  润新知