voidtrans_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");}}voidtrans_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.左右旋转
voidspin_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");}}voidspin_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");}}
旋转后,m 行 n 列的矩阵转成 n 行 m 列,因此行列的 n m 控制条件交换
以右转为例,原本第 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.螺旋
intget_loop(int m,int n){if(m <3|| n <3){return1;}else{returnget_loop(m -2, n -2)+1;}}voidtrans_spiral(constint 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基本思路
先判断 m 行 n 列需要循环几圈,如果小于3行,或者小于3列,都只需要1圈,否则每执行完1圈,剥去2行2列,递归查询
每一次循环都是 → ↓ ← ↑,在上一次的基础上长度缩小一圈
4.完整代码
#include<stdio.h>voidtrans_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");}}voidtrans_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");}}voidspin_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");}}voidspin_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");}}intget_loop(int m,int n){if(m <3|| n <3){return1;}else{returnget_loop(m -2, n -2)+1;}}voidtrans_spiral(constint 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]);}}intmain(){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);return0;}