矩阵的旋转,转置和翻转以及它们的关系
//已知新数组b[i][j] //顺时针旋转 //90° //原数组的列为新数组的行 //原数组的行=N-1-新数组的列 //180° //原数组的行=N-1-新数组的行 //原数组的列=M-1-新数组的列 //270° //原数组的列=M-1-新数组的行 //原数组的行=新数组的列
//得出结论 /* 顺时针选择90° = 转置 + 水平翻转 逆时针旋转90° = 转置 + 垂直翻转 = 顺时针旋转 270° */
//矩阵的旋转 //顺时针旋转90° #include<stdio.h> int main() { int i,j; int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) { b[i][j] = a[2-j][i]; } for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",a[i][j]); printf("\n"); } printf("\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",b[i][j]); printf("\n"); } return 0; }
/* 方法I:已知新数组b[i][j]: 原数组的列为新数组的行 原数组的行=2-新数组的列 b[i][j]=a[2-j][i]
for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]=a[2-j][i];
方法II:已知原数组a[i][j]: 新数组的行为原数组的列 新数组的列=2-原数组的行 b[j][2-i] = a[i][j]
方法II只要修改蓝色代码为:
for(i=0;i<3;i++) for(j=0;j<4;j++) b[j][2-i] = a[i][j];
特别注意for循环的循环次数 */
/*对于一个 N*M 的矩阵来说, 顺时针旋转90° 原数组的列为新数组的行 原数组的行=(N-1)-新数组的列 */![]()
/* 2:顺时针180度 方法I: 已知新数组b[i][j]: 原数组的行=(N-1)-新数组的行 原数组的列=(M-1)-新数组的列 b[i][j]=a[2-i][3-j] 方法II: 已知原数组a[i][j]: 新数组的行=(N-1)-原数组的行 新数组的列=(M-1)-原数组的列 b[2-i][3-j]=a[i][j] */
//方法I: for(i=0;i<4;i++) for(j=0;j<3;j++) b[i][j]=a[2-i][3-j]; //方法II: for(i=0;i<3;i++) for(j=0;j<4;j++) b[2-i][3-j]=a[i][j];
/* 3:顺时针270度 方法I: 已知新数组b[i][j]: 原数组的列=(M-1)-新数组的行 原数组的行=新数组的列 b[i][j]=a[j][3-i] 方法II: 已知原数组a[i][j]: 新数组的行= (M-1)-原数组的列 新数组的列=原数组的行 b[3-j][i]=a[i][j] */
//转置测试 #include<stdio.h> int main() { int i,j; int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) b[i][j] = a[j][i]; for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",a[i][j]); printf("\n"); } printf("\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",b[i][j]); printf("\n"); } return 0; }
//水平翻转 + 转置 测试
#include<stdio.h> int main() { int i,j; int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3][3]={0}; int c[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) b[i][j] = a[j][i]; for(i=0;i<3;i++) for(j=0;j<3;j++) c[i][j] = b[2-i][j]; for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",a[i][j]); printf("\n"); } printf("\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",c[i][j]); printf("\n"); } return 0; }