CSP201503-1:图像旋转

时间:2023-03-09 03:07:36
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;

}