CSP201503-1:图像旋转

Posted husterzxh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n", 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\n", 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;

}

以上是关于CSP201503-1:图像旋转的主要内容,如果未能解决你的问题,请参考以下文章

CCF201503-1 图像旋转(100分)数学计算

201503-1 图像旋转 Java

CCF_201503-1_图像旋转

matlab中图像旋转

图像旋转的原理与实现

快速,旋转图像视图并将旋转的图像视图设置为 uibutton