csp201503-1图像旋转

问题描述

  旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
  计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。

输入格式

  输入的第一行包含两个整数nm,分别表示图像矩阵的行数和列数。
  接下来n行每行包含m个整数,表示输入的图像。

输出格式

  输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。

样例输入

2 3
1 5 3
3 2 4

样例输出

3 4
5 2
1 3

评测用例规模与约定

  1 ≤ n≤ 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;
}

法二借鉴他人;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值