问题描述
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转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的非负整数。
方法一:动态分配内存
涉及动态内存分配函数malloc(包含在#include <stdlib.h>头文件中)、指针与二维数组之间的关系(通过二维数组的列指针来引用二维数组的元素)
顺便复习行地址列地址,行指针列指针的引用,对指向二维数组的列指针,将其看成一个m*n个元素的一维数组,p+i*列数+行数表示数组第i行第j列的地址(切记i*列数,不要急m,n,因为题目m,n可能代表行,也可能代表列)
思路:
1.第一行输入m,n确定行和列
2.调用函数malloc动态分配内存(切记在最后记得free(p)
3.输入n行m列的数据
4.输出逆时针旋转90°之后的结果
a分析过程:将各个元素标号,如原先a[0*3+2],a[1*3+2]要在旋转后变成第一第二输出的,由此可知,输出时改变循环条件即可,行数i内部循环,列数j外部循环
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m,*p=NULL;
int i,j;
scanf("%d%d",&n,&m);
p=(int*)malloc(sizeof(int)*n*m);
if(p==NULL)
{
exit(1);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",p+i*m+j);
}
}
for(j=m-1;j>=0;j--)
{
for(i=0;i<n;i++)
{
printf("%d ",p[i*m+j]);
}
printf("\n");
}
free(p);
return 0;
}
方法二:
题目分析:本体只需要使用两重循环,外层循环按照列的逆序枚举,内层循环按照行的正序枚举,输出枚举得到的数字即可。
涉及知识盲区就是puts(" ");是换行
#include <stdio.h>
#include <stdlib.h>
int a[1005][1005];
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=m;i>=1;i--)
{
for(j=1;j<=n;j++)
{
printf("%d ",a[j][i]);
}
puts(" ");
}
return 0;
}
法二借鉴他人;