#8802. CCF201503-1 图像旋转(100分)【数学计算】

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

Background

问题描述


旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转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的非负整数。

问题简述:

先输入正整数n和m,再输入n*m的整数矩阵,将矩阵逆时针旋转90°输出。

问题分析:

重写解题博客以及解题程序代码(参见参考链接),
解题逻辑更加清晰,
解题代码更加简洁,多种语言解法。 这是一个下标转换问题,
实际上并不需要将数据另外存储。下标转换问题是程序中经常出现的问题,逻辑并不复杂,
需要找出转换数学公式或数学函数关系。 这里给出解题的C语言程序、
Python语言程序和Java语言程序。 Java语言程序只得90分,
应该不是程序逻辑错误,官方评测系统显示内存使用293M,出现内存超限。按理说,矩阵数据量并不大,每个矩阵只有1000×1000个数据,也就4M左右,出现内存超限有点奇怪,应该是内存释放问题导致。考虑到JVM的存储管理机制,也许对于Java语言程序,存储上限应该设置得大一些才合理。

程序说明:


用二维数组存储矩阵,
这是理所当然的事情。 对于C语言程序,输出时,
为了减少减一计算,循环语句用“for (j = 1; j <= m; j++)”,输出元素用“a[i][m - j]”(关键是那个下标表达式"m-j")。
也许这个是没有必要的,
只是一种减少计算的技巧而已。 循环控制变量使用略微特殊一些,
以使得程序更好理解。读入矩阵数据时,行控制用i,列控制用j;而输出时则行控制用j,列控制用i,更为直观易懂。

Limitation

1s, 1024KiB for each test case.