美文网首页周文佳语强化班
矩形数组的各种翻转旋转

矩形数组的各种翻转旋转

作者: LQC | 来源:发表于2019-03-24 16:11 被阅读17次

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

    1、翻转

    1.1、水平翻转

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

    //此方法用于对二维数组进行水平翻转操作。
    public int[][] change(int[][] matrix) {
              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;
    }
    

    测试数据:

    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<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;
         }
    

    测试数据:

    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<matrix.length;i++) {
                    for(int j=0;j<i;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;i++) {
               //(len-1)为矩形数组的最大下标值    //j+i<len-1为限定只交换数组对角线上方的元素
                    for(int j=0,n=len-1-i;j<len-1-i;j++,n--) {
                          // n=len-1-i => n+i=len-1
                          // j<len-1-i <=> j+i<len-1
                          // 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<matrix.length;i++,n--) {
                    for(int j=0;j<matrix[0].length;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<matrix.length;i++) {
                    for(int j=0,n = matrix[0].length-1;j<matrix[0].length;j++,n--) {
                          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进行一系列的操作,必要时要新增一个或多个变量来表示行或列。
    进行对角线翻转时必须要求行和列相同,行列不同时无主次对角线,无法进行对角线翻转,而进行水平翻转、垂直翻转、顺时针旋转、逆时针旋转时则不要求行列相同。
    操作矩形的各种翻转旋转关键时找寻规律,找到规律再写算法时就简单了。

    相关文章

      网友评论

        本文标题:矩形数组的各种翻转旋转

        本文链接:https://www.haomeiwen.com/subject/iwpuvqtx.html