#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.