今天是释然发题解的第一天,以后每一天都会和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣。
今天我们来聊一聊矩阵的翻转,明天和大家分享矩阵的旋转:
矩阵的翻转又分为:水平翻转和垂直翻转
水平翻转:
指将n/2行之前的元素和n/2行后的元素位置进行互换
例如:把下面这个矩阵翻转
1 2 3
4 5 6
7 8 9
翻转成
7 8 9
4 5 6
1 2 3
那么我们应该如何去翻转呢?
首先我们考虑一维的情况,也就是数组的旋转:
对于以下一维数组:
a[]={1,2,3,4,5};
先从第一个元素开始遍历,到n/2,然后将每个元素与n-i进行互换就可以了
代码如下:
int *fliphorizontal(int a[], int n)
{
int i, tem=0;
for (i = 0; i <= n / 2; i++)
{
tem=a[i];
a[i]=a[n-i-1];
a[n-i-1]=tem;
}
return a;
}
这样上面的数组就变成了
a[]={5,4,3,2,1};
其实对于矩阵的翻转也是这样,我们开一个二维数组,i代表的是从0到n/2,j代表0到n-1列,类似于一维数组的变换,因为比较简单,所以直接把代码给大家:
//水平翻转
int *fliphorizontal(int matrix[][], int n)
{
int tem = 0, row_max = matrix.length - 1;
//rows 用来保存二维数组的行数最大值
for (int i = 0; i < matrix.length / 2; i++)
{
for (int j = 0; j < matrix[0].length; j++)
{
tem = matrix[row_max - i][j];
//(row_max - i)为倒数i行对应的行。
matrix[row_max - i][j] = matrix[i][j];
matrix[i][j] = tem;
}
}
return matrix;
}
垂直翻转:
接下来我们来聊垂直翻转。也叫镜面翻转,原理也很简单每一行先作一维数组的变换,再从第0行遍历到第n-1行就可以啦,代码如下:
//垂直翻转
int[][] *flipvertical(int[][] matrix)
{ //记录列的最大值
int tem = 0,row_max = matrix[0].length-1;
//先进行列变换,再拓展到每行
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[0].length/2;j++)
{
tem = matrix[i][row_max-j];
matrix[i][row_max-j] = matrix[i][j];
matrix[i][j] = tem;
}
}
return matrix;
}
矩阵的翻转是不是很有意思呢?我们也经常需要用到对称和镜像的思想,
释然每天发布一点自己学习的知识,希望2年后我们也能在ACM的赛场上见面,一起去追寻自己的程序猿之路吧!
后期也会和大家一起分享学习心得和学习经验呢,明天我们不见不散哦
下期预告:
矩阵旋转:
如果大家有什么建议或者要求请后台留言,释然也想和大家一起进步呀!
联系方式:shirandexiaowo@foxmail.com