试题编号:201503-1
试题名称:图像旋转 时间限制:5.0s内存限制:256.0MB
问题描述:
问题描述
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转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的非负整数。
建议用时:不超过半个小时(包括写代码)
程序设计思想:
题目要求90度旋转输入样例,于是开始寻找输入样例和输出样例之间的关系,也就是数字排布关系。接下来观察输入样例和输出样例,可以发现一个关系,就是输入样例中第一行的数字排布(1 5 3)和输出样例第一列的数组排序(3 5 1)是反序的,观察输入样例的第二行和输出样例的第二列同样可以发现这个关系。除了观察外,你直接把头旋转90度也能很清楚的发现这个规律。
于是,代码大体思路就出来了,具体实现如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
void main()
{
int **p,**q;
int n,m,i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
p=(int**)malloc(n*sizeof(int*)); //建立p的二维数组
if(p==NULL)
{
printf("Not enough memory!\n");
exit(0);
}
for(i=0;i<n;i++)
{
p[i]=(int*)malloc(m*sizeof(int));
if(p[i]==NULL)
{
printf("Not enough memory!\n");
exit(0);
}
}
q=(int**)malloc(m*sizeof(int*)); //建立q的二维数组
if(q==NULL)
{
printf("Not enough memory!\n");
exit(0);
}
for(i=0;i<m;i++)
{
q[i]=(int*)malloc(n*sizeof(int));
if(q[i]==NULL)
{
printf("Not enough memory!\n");
exit(0);
}
}
for(i=0;i<n;i++) //输入元素到p的二维数组中
for(j=0;j<m;j++)
scanf("%d",&p[i][j]);
for(i=0;i<n;i++) //算法核心:旋转矩阵,新的矩阵存放到q的二维数组中
for(j=m-1;j>=0;j--)
q[m-1-j][i]=p[i][j];
printf("\n");
for(i=0;i<m;i++) //输出q中元素,也就是旋转后的矩阵
{
for(j=0;j<n;j++)
printf("%d ",q[i][j]);
printf("\n");
}
for(i=0;i<n;i++) //别忘记释放指针,否则循环的输入次数过多内存会不够
free(p[i]);
free(p);
for(i=0;i<m;i++)
free(q[i]);
free(q);
}
}