Jasin Yip

计蒜客【挑战难题】系列讲解(五)矩阵翻转

题目

第5题:矩阵翻转

  晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。
  输入第一行包括由空格分开的整数M、N、T(0<M<200,0<N<200,T=0或1),其中M和N分别表示待处理矩阵的行数与列数,T为0时表示左右翻转,为1时表示上下翻转。
  之后的M行,每行包括由空格分隔的N个整数,依次为输入矩阵的每一行的数据。
  输出包括M行N列,每个数字之间用一个空格分隔,每一行行末均有一个空格,表示的是按照要求翻转后的矩阵。

样例输入

4 4 1
1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6

样例输出

3 4 5 6 
9 0 1 2 
5 6 7 8 
1 2 3 4 

C 实现

#include <stdio.h>  

int main()  
{
  //M为行数,N为列数,Mode为上下(0)/左右(1)模式的选择
  int m, n, mode;  
  int i, j;  
  int before[200][200]={0}, after[200][200]={0};  
  scanf("%d%d%d", &m, &n, &mode);  
  //input  
  for (i=0; i<m; i++)  
    for (j=0; j<n; j++)  
      scanf("%d", &before[i][j]);  
  //change  
  if (mode==0)  //模式选择  
    for (i=0; i<m; i++)  
      for (j=0; j<n; j++)  
        after[i][j]=before[i][n-j-1];  
  else 
    for (i=0; i<m; i++)  
      for (j=0; j<n; j++)  
        after[i][j]=before[m-i-1][j];  
  //output  
  for (i=0; i<m; i++){   
    for (j=0; j<n; j++)
      printf("%d ", after[i][j]);       
    printf("\n");  
  }  
  return 0;  
}

它如何工作

实际上这道题目并不难,为了简单,我定义了两个同样大小的数组(反正题目给了10M的内存我们用嘿嘿)
这两个数组分别是翻转前before,以及翻转后after,因为是矩阵,所以定义为二维数组。

输入部分忽略不讲。

交换部分:

左右交换时,我只需要将行号不变,列号翻转过来就行了,也就是:

after[i][j]=before[i][n-j-1];

如果不理解的话就尝试跟着我的程序一步一步走,你就明白了。

当然还有另一种算法能省几乎一半空间,那就是增加一个temp变量,交换两个值就行了,大家有兴趣可以去写一写哟!

标签:c语言, 计蒜客, 挑战难题

已有 9 条评论

  1. [...]原文链接:http://jasinyip.com/CC/jskproblem5.html[...]

  2. Coco Coco

    学习!

  3. liuxinglong liuxinglong

    可以给我详细的说一下每一步的意思的吗?
    谢谢 非常感谢
    也可以加我qq2557130075

  4. ffff ffff

    I don't know

  5. viva viva

    why int arr[200][200] but not arr[M][N]?

    1. Owl Owl

      我试过arr[M][N],结果是不行的,为此还调试了半天。如果用arr[M][N],后面的结果出来的矩阵是1行N列的。可能是定义的时候M N都是变量,而定义数组的时候就要分配内存空间,所以维数不能是变量吧(猜的)。

      1. third party third party

        定义数组的时候要直接声明数组大小

  6. yijia yijia

    懒得写了,直接copy哈哈

  7. Gswn Gswn

    懒得写直接抄的说~~~

添加新评论