矩阵的各种翻转、旋转

矩阵的各种翻转、旋转

矩形数组水平翻转、垂直翻转、对角线翻转、逆时针旋转、顺时针旋转。

1、翻转

1.1、水平翻转

使二维数组进行水平翻转即使(n/2)行之前的元素和之后的元素交换,即行进行交换。

代码:

//此方法用于对二维数组进行水平翻转操作。

public int[][] change(int[][] matrix) {

int tem=0,row_max = matrix.length-1;//rows 用来保存二维数组的行数最大值

for(int i=0;i

for(int j=0;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;

}

测试数据:

int[][] matrix={

{1,2,3,4},

{5,6,7,8},

{9,10,11,12}

};

输出结果:

9 10 11 12

5 6 7 8

1 2 3 4

1.2、垂直翻转

垂直翻转和水平翻转思想相同不再赘述。

代码:

public int[][] change(int[][] matrix){

int tem = 0,row_max = matrix[0].length-1;

for(int i=0;i

for(int j=0;j

tem = matrix[i][row_max-j];

matrix[i][row_max-j] = matrix[i][j];

matrix[i][j] = tem;

}

}

return matrix;

}

测试数据:

int[][] matrix={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

即:

1 2 3 4

5 6 7 8

9 10 11 12

输出结果:

4 3 2 1

8 7 6 5

12 11 10 9

1.3、主对角线翻转

此算法进行主对角线翻转时要求行和列的数量相同。

代码:

public int[][] change(int[][] matrix){

int tem;

for(int i=0;i

for(int j=0;j

tem = matrix[j][i];

matrix[j][i] = matrix[i][j];

matrix[i][j] = tem;

}

}

return matrix;

}

测试数据:

int[][] matrix2={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

即:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 16 16

输出结果:

1 5 13

2 6 10 14

3 7 11 15

4 8 12 16

1.4、次对角线翻转

要求同上(行列数量相同)。

代码:

public int[][] change(int[][] matrix){

int len = matrix.length,term=0;

for(int i=0;i

//(len-1)为矩形数组的最大下标值 //j+i

for(int j=0,n=len-1-i;j

// n=len-1-i => n+i=len-1

// j j+i

// n与i的和为矩形数组下标最大值,j与i的和不大于矩形数组下标的最大值

term=matrix[i][j];

matrix[i][j]=matrix[i+n][j+n];

matrix[i+n][j+n]=term;

}

}

return matrix;

}

测试数据:

int[][] matrix2 = {

{1,2,3},

{4,5,6},

{7,8,9},

};

输入结果:

9 6 3

8 5 2

7 4 1

2、旋转

这里对矩形二维数组的各个元素进行顺时针旋转90度和逆时针旋转90度。其他旋转度数可以多次进行顺时针或逆时针旋转90度得到,这里不再演示。

2.1、顺时针旋转90度

把所有的数组元素顺时针旋转90度。

代码:

public int[][] change(int[][] matrix){

// 在建立新数组时将行和列的数量进行交换

int[][] matrix2 = new

int[matrix[0].length][matrix.length];

// n为控制新数组列的输入的一个变量

for(int i=0,n = matrix.length-1;i

for(int j=0;j

//当i=0,j=0时,matrix2[0][matrix.length-1]在第一行最后一个元素的位置

//当i=0,j=1时,matrix2[1][matrix.length-1]在第二行最后一个元素的位置

//...依次往后推即可发现规律--原数组列的递增就是新数组最后一列行的递增

matrix2[j][n] = matrix[i][j];

}

}

return matrix2;

}

测试数据:

int[][] matrix={

{1,2,3,4},

{5,6,7,8},

{9,10,11,12}

};

输出结果:

9 5 1

10 6 2

11 7 3

12 8 4

2.2、逆时针旋转90度

思想同上。

代码:

public static int[][] change(int[][] matrix){

int[][] matrix2 = new int[matrix[0].length][matrix.length];

for(int i=0;i

for(int j=0,n = matrix[0].length-1;j

matrix2[n][i] = matrix[i][j];

}

}

return matrix2;

}

测试数据:

int[][] matrix={

{1,2,3,4},

{5,6,7,8},

{9,10,11,12}

};

输出结果:

4 8 12

3 7 11

2 6 10

1 5 9

3、总结

通过一系列的测试和演示我们可以发现,对矩形二维数组的翻转和旋转总是建立在二重循环的基础上,然后再对i、j进行一系列的操作,必要时要新增一个或多个变量来表示行或列。

进行对角线翻转时必须要求行和列相同,行列不同时无主次对角线,无法进行对角线翻转,而进行水平翻转、垂直翻转、顺时针旋转、逆时针旋转时则不要求行列相同。

操作矩形的各种翻转旋转关键时找寻规律,找到规律再写算法时就简单了。

相关推荐

2025最新排名|盘点值得推荐的5个在线客服系统
365彩票数据最专业

2025最新排名|盘点值得推荐的5个在线客服系统

📅 07-17 👁️ 7802
鉳 - 教育百科
365账号限制投注怎么办

鉳 - 教育百科

📅 08-04 👁️ 7512
最新直发器价格是多少?报价是什么?
365彩票数据最专业

最新直发器价格是多少?报价是什么?

📅 07-05 👁️ 5535
wish填多少库存比较好
365账号限制投注怎么办

wish填多少库存比较好

📅 08-31 👁️ 8188
关于诗词的12本好书(必备书单)
s365 2.2.3

关于诗词的12本好书(必备书单)

📅 07-18 👁️ 6645
《开讲啦》 20161004 本期演讲者:中国女排
365账号限制投注怎么办

《开讲啦》 20161004 本期演讲者:中国女排

📅 09-14 👁️ 3120
魔兽世界怀旧服:AA副本全攻略 升级赚钱两不误 首选自然是MC
365账号限制投注怎么办

魔兽世界怀旧服:AA副本全攻略 升级赚钱两不误 首选自然是MC

📅 09-13 👁️ 3593
讔谜的意思
365账号限制投注怎么办

讔谜的意思

📅 06-29 👁️ 7560
地球属于什么星
365彩票数据最专业

地球属于什么星

📅 07-16 👁️ 3438