• CSP201503-1:图像旋转


    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试,针对计算机软件开发、软件测试、信息管理等领域的专业人士进行能力认证。认证对象是从事或将要从事IT领域专业技术与技术管理人员,以及高校招考研究生的复试对象。

     

    • 问题描述

      旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。

      计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。

    • 输入格式

      输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。

      接下来n行每行包含m个整数,表示输入的图像。

    • 输出格式

      输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。

    • 样例输入

      2 3

      1 5 3

      3 2 4

    • 样例输出

      3 4

      5 2

      1 3

    • 评测用例规模与约定

      1 n, m 1,000,矩阵中的数都是不超过1000的非负整数。

     

    • 源代码(一):使用动态分配的一维数组

    /* 一维数组的方式求解,空间动态分配 */

    # include <stdio.h>

    # include <stdlib.h>

    # include <memory.h>

    int main(void)

    {

        int n; //行数

        int m; //列数

        scanf("%d", &n);

        scanf("%d", &m);

        int count = m*n+1;

        int *input = (int *)malloc(sizeof(int) * count);

        memset(input, 0, sizeof(int) * count);

        int *output = (int *)malloc(sizeof(int) * count);

        memset(output, 0, sizeof(int) * count);

        

        for (int i = 1; i < count; i++)

        {

            scanf("%d", input+i);

            int row_in = (i / m) + 1;

            int column_in = i % m;

            if (column_in == 0)

            {

                row_in -= 1;

                column_in = m;

            }

            int row_out = m + 1 - column_in;

            int column_out = row_in;

            output[(row_out - 1) * n + column_out] = input[i];    

        }

          

        

        int num = 0;

        for (int i = 1; i < count; i++)

        {

            num += 1;

            if (num == n)

            {

                printf("%d ", output[i]);

                num = 0;

            }

            else

            {

                printf("%d ", output[i]);

            }

        }

        

        free(input);

        free(output);

        

        return 0;

    }

    • 源代码(二):使用动态分配的二维数组

    /* 二维数组的方式求解,空间动态分配 */

    # include <stdio.h>

    # include <stdlib.h>

    # include <memory.h>

    int main(void)

    {

        int n; //行数

        int m; //列数

        scanf("%d", &n);

        scanf("%d", &m);

        //给输入的二维数据分配空间

        int **input = (int **)malloc(sizeof(int *) * n); //给行分配空间

        for (int i = 0; i < n; i++) //给列分配空间

        {

            input[i] = (int *)malloc(sizeof(int) * m);

            memset(input[i], 0, sizeof(int) * m);

        }

        //给输出的二维数组分配空间

        int **output = (int **)malloc(sizeof(int *) * m); //给行分配空间

        for (int i = 0; i < m; i++) //给列分配空间

        {

            output[i] = (int *)malloc(sizeof(int) * n);

            memset(output[i], 0, sizeof(int) * n);

        }

        

        for (int i = 0; i < n; i++)

        {

            for (int j = 0; j < m; j++)

            {

                scanf("%d", &input[i][j]);

                output[m-1-j][i] = input[i][j];

            }

        }

          

        for (int i = 0; i < m; i++)

        {

            for (int j = 0; j < n; j++)

            {

                if (j == n-1)

                {

                    printf("%d ", output[i][j]);

                }

                else

                {

                    printf("%d ", output[i][j]);

                }

            }

        }

        

        //回收分配给输入数组的内存

        for (int i = 0; i < n; i++)

        {

            free(input[i]);

        }

        free(input);

        //回收分配给输出数组的内存

        for (int i = 0; i < m; i++)

        {

            free(output[i]);

        }

        free(output);

        

        return 0;

    }

  • 相关阅读:
    《程序员修炼之道:从小工到专家》阅读笔记02
    第二阶段团队冲刺10
    第二阶段团队冲刺09
    周总结
    第二阶段团队冲刺08
    第二阶段团队冲刺07
    小A和小B和幽灵追两人(双向BFS)
    C. 真假亚瑟王(暴力)
    小A的柱状图(栈的应用,找左右边界)
    小A买彩票
  • 原文地址:https://www.cnblogs.com/husterzxh/p/8411179.html
Copyright © 2020-2023  润新知