问题:为什么矩阵要用一维数组表示呢?

 因为我对C语言还很不熟,在我写的过程中,因为要抽成函数,二维数组的传参怎么写编译都不通过(脑子里都是Java
的语法)。而在C语言中,二维数组在内存中是连续的,表现形式和一维数组一样,通过控制下标可以实现二维数组的效果。

1.左右,上下翻转

void trans_x(int arr[], int m, int n) {for (int i = 0; i < m; ++i) {for (int j = n - 1; j >= 0; --j) {printf("%d ", arr[i * n + j]);}printf("\n");}
}void trans_y(int arr[], int m, int n) {for (int i = m - 1; i >= 0; --i) {for (int j = 0; j < n; ++j) {printf("%d ", arr[i * n + j]);}printf("\n");}
}
这个很简单,左右翻转,行的控制条件不变,列逆序输出,上下翻转同理

2.左右旋转

void spin_left(int arr[], int m, int n) {for (int i = 0; i < n; ++i) {int j;for (j = 0; j < m; ++j) {printf("%d ", arr[j * n + (n - i - 1)]);}printf("\n");}
}void spin_right(int arr[], int m, int n) {for (int i = 0; i < n; ++i) {int j;for (j = 0; j < m; ++j) {printf("%d ", arr[(m - j - 1) * n + i]);}printf("\n");}
}
  1. 旋转后,m 行 n 列的矩阵转成 n 行 m 列,因此行列的 n m 控制条件交换
  2. 以右转为例,原本第 j 行的数据转成第 m - j - 1 列,第 i 列的数据转成第 i 行, 因此 arr[ i ][ j ] 右转后成为
    arr[ m - i - 1 ][ j ] ,加上一维数组控制下标就成为 (m - i - 1) * n + j ,n m 调转后就成了 (m - j - 1) * n + i

3.螺旋

int get_loop(int m, int n) {if (m < 3 || n < 3) {return 1;} else {return get_loop(m - 2, n - 2) + 1;}
}void trans_spiral(const int arr[], int m, int n) {int loop_times = 0, index = 0;int loop = get_loop(m, n);int res[m * n];while (loop_times < loop) {if (loop_times == n - loop_times - 1) {//说明 n 是奇数,当前执行到了最中间的一列,直接同一列向下,直到 m - loop_timesfor (int i = loop_times; i < m - loop_times; ++i) {res[index++] = arr[i * n + loop_times];}break;}//从左到右for (int i = loop_times; i < n - loop_times - 1; ++i) {res[index++] = arr[loop_times * n + i];}//从上到下for (int i = loop_times; i < m - loop_times - 1; ++i) {res[index++] = arr[i * n + (n - loop_times - 1)];}//从右到左for (int i = n - loop_times - 1; i > loop_times; --i) {res[index++] = arr[(m - loop_times - 1) * n + i];}//从下到上for (int i = m - loop_times - 1; i > loop_times; --i) {res[index++] = arr[i * n + loop_times];}loop_times++;}for (int i = 0; i < m * n; ++i) {printf("%d ", res[i]);}
}

3.1基本思路

  1. 先判断 m 行 n 列需要循环几圈,如果小于3行,或者小于3列,都只需要1圈,否则每执行完1圈,剥去2行2列,递归查询
  2. 每一次循环都是 → ↓ ← ↑,在上一次的基础上长度缩小一圈

4.完整代码

#include <stdio.h>void trans_x(int arr[], int m, int n) {for (int i = 0; i < m; ++i) {for (int j = n - 1; j >= 0; --j) {printf("%d ", arr[i * n + j]);}printf("\n");}
}void trans_y(int arr[], int m, int n) {for (int i = m - 1; i >= 0; --i) {for (int j = 0; j < n; ++j) {printf("%d ", arr[i * n + j]);}printf("\n");}
}void spin_left(int arr[], int m, int n) {for (int i = 0; i < n; ++i) {int j;for (j = 0; j < m; ++j) {printf("%d ", arr[j * n + (n - i - 1)]);}printf("\n");}
}void spin_right(int arr[], int m, int n) {for (int i = 0; i < n; ++i) {int j;for (j = 0; j < m; ++j) {printf("%d ", arr[(m - j - 1) * n + i]);}printf("\n");}
}int get_loop(int m, int n) {if (m < 3 || n < 3) {return 1;} else {return get_loop(m - 2, n - 2) + 1;}
}void trans_spiral(const int arr[], int m, int n) {int loop_times = 0, index = 0;int loop = get_loop(m, n);int res[m * n];while (loop_times < loop) {if (loop_times == n - loop_times - 1) {for (int i = loop_times; i < m - loop_times; ++i) {res[index++] = arr[i * n + loop_times];}break;}for (int i = loop_times; i < n - loop_times - 1; ++i) {res[index++] = arr[loop_times * n + i];}for (int i = loop_times; i < m - loop_times - 1; ++i) {res[index++] = arr[i * n + (n - loop_times - 1)];}for (int i = n - loop_times - 1; i > loop_times; --i) {res[index++] = arr[(m - loop_times - 1) * n + i];}for (int i = m - loop_times - 1; i > loop_times; --i) {res[index++] = arr[i * n + loop_times];}loop_times++;}for (int i = 0; i < m * n; ++i) {printf("%d ", res[i]);}
}int main() {int arr[] = {38, 42, 21, 31, 10, 15, 94,30, 38, 41, 41, 68, 11, 59,92, 46, 55, 90, 43, 6, 16,63, 11, 6, 75, 57, 71, 64,4, 89, 94, 45, 45, 55, 59,15, 87, 82, 65, 15, 8, 11,89, 55, 25, 86, 18, 18, 86,9, 7, 14, 95, 81, 99, 34,1, 50, 5, 40, 58, 23, 21,};trans_x(arr, 9, 7);printf("\n-------------------------------\n");trans_y(arr, 9, 7);printf("\n-------------------------------\n");spin_left(arr, 9, 7);printf("\n-------------------------------\n");spin_right(arr, 9, 7);printf("\n-------------------------------\n");trans_spiral(arr, 9, 7);return 0;
}

运行结果

94 15 10 31 21 42 38
59 11 68 41 41 38 30
16 6 43 90 55 46 92
64 71 57 75 6 11 63
59 55 45 45 94 89 4
11 8 15 65 82 87 15
86 18 18 86 25 55 89
34 99 81 95 14 7 9
21 23 58 40 5 50 1-------------------------------
1 50 5 40 58 23 21
9 7 14 95 81 99 34
89 55 25 86 18 18 86
15 87 82 65 15 8 11
4 89 94 45 45 55 59
63 11 6 75 57 71 64
92 46 55 90 43 6 16
30 38 41 41 68 11 59
38 42 21 31 10 15 94-------------------------------
94 59 16 64 59 11 86 34 21
15 11 6 71 55 8 18 99 23
10 68 43 57 45 15 18 81 58
31 41 90 75 45 65 86 95 40
21 41 55 6 94 82 25 14 5
42 38 46 11 89 87 55 7 50
38 30 92 63 4 15 89 9 1-------------------------------
1 9 89 15 4 63 92 30 38
50 7 55 87 89 11 46 38 42
5 14 25 82 94 6 55 41 21
40 95 86 65 45 75 90 41 31
58 81 18 15 45 57 43 68 10
23 99 18 8 55 71 6 11 15
21 34 86 11 59 64 16 59 94-------------------------------
38 42 21 31 10 15 94 59 16 64 59 11 86 34 21 23 58 40 5 50 1 9 89 15 463 92 30 38 41 41 68 11 6 71 55 8 18 99 81 95 14 7 55 87 89 11 46 55 90 43 57 45 15 18 86 25 82 94 6 75 45 65

C语言 矩阵翻转,旋转,螺旋输出相关推荐

  1. c语言定义int 输出4386,C语言 · 矩阵乘法

    问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...

  2. 矩阵的旋转和翻转——Python

    矩阵的生成,调用numpy库: import numpy as np a = np.array([x for x in range(16)]) b = a.reshape(4,2,2) 输出: 矩阵翻 ...

  3. c语言编程将图片上下翻转,C语言实现矩阵翻转(上下翻转、左右翻转)

    C语言实现矩阵翻转 上下翻转与左右翻转 实例代码: #include void matrix (int m, int n, int t) { int arr[m][n]; int i, j, k; f ...

  4. C语言矩阵N*N旋转的算法(附完整源码)

    C语言矩阵N*N旋转的算法 C语言矩阵N*N旋转的算法完整源码(定义,实现,main函数测试) C语言矩阵N*N旋转的算法完整源码(定义,实现,main函数测试) #include<iostre ...

  5. C语言坐标旋转,c语言矩阵的顺、逆时针旋转

    <c语言矩阵的顺.逆时针旋转>由会员分享,可在线阅读,更多相关<c语言矩阵的顺.逆时针旋转(2页珍藏版)>请在人人文库网上搜索. 1.include #include /矩阵顺 ...

  6. 将矩阵逆时针旋转45°后输出

    [问题描述] 将矩阵逆时针旋转45°后输出. [算法代码] #include <iostream> using namespace std;const int maxn=110; int ...

  7. c语言 矩阵反转输出

    参考: 学习记录-矩阵翻转输出link 代码: #include <stdio.h>int main() {int matrix[105][105];int m;int n;scanf(& ...

  8. matlab矩阵逆时针旋转90度_MATLAB矩阵的翻转求逆旋转转置

    对角阵 对角矩阵 只有对角线上有非零元素的矩阵 数量矩阵 对角线上的元素相等的对角矩阵 单位矩阵 对角线上都为1的对角矩阵 (1)提取矩阵的对角线上的元素 diag(A) 提取矩阵A主对角线元素,产生 ...

  9. c语言实现上下左右移动,C语言实现矩阵翻转(上下翻转、左右翻转)分享

    --想了解C语言实现矩阵翻转(上下翻转.左右翻转)分享的全部内容且更多的C语言教程关注 C语言实现矩阵翻转 上下翻转与左右翻转 实例代码: #include void matrix (int m, i ...

最新文章

  1. 脉脉成为互联网大厂公敌
  2. NEC Programming Contest 2021 (AtCoder Beginner Contest 229)
  3. (6)ISE14.7生成bit文件报错解决(FPGA不积跬步101)
  4. 【论文写作】文献资料的作用只是添砖加瓦
  5. python能学到什么-学习python三个月能学到什么?
  6. Sqlserver2008 数据库镜像会话的初始连接
  7. 勒索老黄未果!黑客公布英伟达核心源代码,超40万个文件、75GB机密数据
  8. hdoj-1046-Gridland(规律题)
  9. hisi3520dv400镜像烧录方法(hitool)或/tftp
  10. 找不到任何设备驱动程序.请确保安装介质_Windows 10 1909全新安装终极指南
  11. 相机存储卡格式化了数据能恢复吗,相机储存卡数据误删如何恢复
  12. 如何使用QT?步骤详解
  13. [翻译+分析总结] nnU-Net for Brain Tumor Segmentation
  14. php执行fastlane,Fastlane使用说明 自动化打包
  15. 劳动与社会保障法-作业
  16. 计算机管理 网络连接服务,电脑出现无法连接网络问题怎么解决
  17. 最新时下最火的盲盒商城源码/视频搭建教程
  18. Rsync 服务部署与参数详解
  19. 试看5分钟视频python_不会Python吗?几分钟看完资深程序员给你的Python入门指南...
  20. (复健计划)python中的字典

热门文章

  1. PTA L1-056 猜数字 C/C++
  2. 【暑假学习笔记】之——用Intellij idea新建一个java web+Servlet项目(有实例)——idea中快速重写父类的方法
  3. 82-《大厂高薪必备技能实战1期》14-百亿短视频系统实战-剪辑_ev 没用
  4. openAI gpt部署服务器QQ机器人docker实现
  5. 出差高铁降噪高音质蓝牙耳机,时尚小巧高续航
  6. 华为哪款手机是鸿蒙系统_全球首发鸿蒙系统华为手机型号确认!明年H2发布:搭载鸿蒙3.0系统...
  7. 2022-2028全球与中国3D液晶屏市场现状及未来发展趋势
  8. vue九宫格抽奖dom记录
  9. 九度OJ题目1019:简单计算器
  10. Vue项目配置git忽略文件