标题
图像旋转
问题描述
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像顺时针旋转90度。
计算机中的图像可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。例如,下面的矩阵(a)表示原始图像,矩阵(b)表示顺时针旋转90度后的图像。
输入说明
输入的第一行包含两个整数n和m,分别表示图像矩阵的行数和列数。1 ≤ n, m ≤ 100。
接下来n行,每行包含m个非负整数,表示输入的图像,整数之间用空格分隔。
输出说明
输出m行,每行n个整数,表示顺时针旋转90度之后的矩阵,元素之间用空格分隔。
输入样例
2 3
1 5 3
3 2 4
输出样例
3 1
2 5
4 3
代码实现:
#include <stdio.h>
int main() {
int n, m, a[101][101], b[101][101];//a存储旧图像,b存储新图像
scanf("%d %d", &n, &m);
int pos1 = 1, pos2 = n;//按照输入的顺序寻找旋转后图像的起点,将输入的数据存储到对应位置,换言之,代码可以更短
for (register int i = 1; i <= n; i++) {
for (register int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
b[pos1][pos2] = a[i][j];
if (pos1 < m) {
pos1++;//纵向向下存储
} else {
pos1 = 1;//纵向到底,切换下一行
pos2--;
}
}
}
for (register int i = 1; i <= m; i++) {
for (register int j = 1; j <= n; j++) {
printf("%d ", b[i][j]);//输出
}
printf("\n");
}
return 0;
}
制造一个更短的代码:(纯代码21行)
#include <stdio.h>
int main() {
int n, m, b[101][101];
scanf("%d %d", &n, &m);
for (register int i = 1, pos1 = 1, pos2 = n; i <= n * m; i++) {
scanf("%d", &b[pos1][pos2]);
if (pos1 < m) {
pos1++;
} else {
pos1 = 1;
pos2--;
}
}
for (register int i = 1; i <= m; i++) {
for (register int j = 1; j <= n; j++) {
printf("%d ", b[i][j]);
}
printf("\n");
}
return 0;
}