CSP计算机认证考试 图像转换 纯C实现

试题编号: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);

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41133154/article/details/78614449