#P1706. 二维矩阵的的旋转和翻转
二维矩阵的的旋转和翻转
1. 二维 n*n 矩阵通过旋转,可以得到 3 个新的形态。
2. 二维 n*n 矩阵先上下翻转(或者左右翻转,或者对角翻转),然后再旋转,一共可以得到 4 个新的形态。
上述一共 8 个形态,是二维 n*n 矩阵通过任意的翻转和旋转能得到的所有形态。记住,不可能有第 9 个不一样的形态了。
3. 矩阵旋转代码
3.1 输出顺时针旋转之后的整个数字阵列
假设一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),要对它顺时针旋转 90 度之后输出,那么要点是:
-
外循环应该是旋转之后的行;也就是旋转之前的列,应该是从 1 到 m (递增)
-
内层循环应该是旋转之后的列,也就是旋转之前的行,但是应该是从 n 到 1 (递减)
我们脑海里面还是对着旋转之前的矩阵,但是是以新的顺序去输出数字阵列
//假设在前面已经完成的二维数组的定义和赋值,下面仅仅是旋转输出
for(j=1;j<=m;j++)
{
for(i=n;i>=1;i--)
{
prtintf("%d ",a[i][j]);
}
prtintf("\n");
}
3.2 输出逆时针旋转之后的整个数字阵列
假设一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),要对它逆时针旋转 90 度之后输出,那么要点是:
-
外循环应该是旋转之后的行;也就是旋转之前的列,应该是从 m 到 1 (递减)
-
内层循环应该是旋转之后的列,也就是旋转之前的行,但是应该是从 1 到 n (递增)
//假设在前面已经完成的二维数组的定义和赋值,下面仅仅是旋转输出
for(j=m;j>=1;j--)
{
for(i=1;i<=n;i++)
{
prtintf("%d ",a[i][j]);
}
prtintf("\n");
}
3.3 完整输出顺(逆)时针180度之后的整个数字阵列
一个数字阵列 A ,顺时针旋转180度和逆时针旋转180度之后的数字所得到的 2 个新数阵是一样的。
//假设在前面已经完成的二维数组的定义和赋值,下面仅仅是旋转输出
for(i=n;i>=1;i--)
{
for(j=m;i>=1;j--)
{
prtintf("%d ",a[i][j]);
}
prtintf("\n");
}
-
外循环应该是旋转之后的行;还是旋转之前的行,但方向变成了从 n 到 1 (递减)
-
内层循环应该是旋转之后的列,还是旋转之前的列,但方向变成了从 m 到 1 (递减)
3.4 旋转前后的数组元素对应关系
很多时候,并不需要完整输出整个数字阵列,而只需要引用旋转之后的某个数组元素。
-
一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),数组元素 a[i][j] , 顺时针旋转 90 度之后,它会变成新矩阵的 a'[j][n-i+1]
-
一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),数组元素 a[i][j] , 逆时针旋转 90 度之后,它会变成新矩阵的 a'[m-j+1][i]
-
一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),数组元素 a[i][j] , 顺(逆)时针旋转 180 度之后,它会变成新矩阵的 a'[n-i+1][m-j+1]
-
一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),顺时针旋转 90 度之后的 a'[i][j],在旋转之前对应的是 a[m-j+1][i] (这个情况,可以想象成把 a' 数组逆时针旋转 90 度之后得到 a 数组)
-
一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),逆时针旋转 90 度之后的 a'[i][j],在旋转之前对应的是 a[j]][n-i+1] (这个情况,可以想象成把 a' 数组顺时针旋转 90 度之后得到 a 数组)
-
一个 n行 * m列 的数字阵列(行号从 1 到 n,列号从 1 到 m),顺(逆)湿疹旋转 180 度之后,数组元素 a'[i][j] , 在旋转之前对应的是 a[n-i+1][m-j+1]
4. 矩阵翻转代码
4.1 完整输出水平翻转之后的数字阵列
行顺序不变(从上往下),逆向输出每一行内的元素(从右到做)。
for(i=1;i<=n;i++)
{
for(j=m;j>=1;--)
{
prtintf("%d ",a[i][j]);
}
prtintf("\n");
}
4.2 完整输出上下翻转之后的数字阵列
从下往上输出每一行,每一行内的元素顺序不变(从左到右)。
for(i=n;i>=1;i--)
{
for(j=1;j<=m;j++)
{
prtintf("%d ",a[i][j]);
}
prtintf("\n");
}
4.3 翻转前后的数组元素对应关系
-
数组元素 a[i][j],水平翻转之后,对应的元素是 a'[i][m-j+1]
-
数组元素 a[i][j],上下翻转之后,对应的元素是 a'[n-i+1][j]
-
数组 a 水平翻转之后得到 a', 水平翻转之后的 a'[i][j] 对应翻转之前的 a[i][m-j+1]
-
数组 a 上下翻转之后得到 a', 上下翻转之后的 a'[i][j] 对应翻转之前的 a[n-i+1][j]