繁体   English   中英

矩阵“层”旋转

[英]Matrix "Layer" Rotation

考虑一个 m*n 阶矩阵。

它有 l 层。

我需要按逆时针方向旋转每一层。


像这样


这是我想出的代码。

        int a1=0; // a1,a2,a3,a4 are counters which start at beginning and the end of each row and column and are then moved to the next layers
        int a2=m-1;
        int a3=n-1;
        int a4=0;
        for(int j=0;j<l;j++) // l is the layers of the matrix
        {
            c=rotate(a,a1,a2,a3,a4);
            a1++;
            a2--;
            a3--;
            a4++; 
        }

这是rotate方法,它将传递的数组旋转1个单位

public static int[][] rotate(int a[][],int a1,int a2,int a3,int a4){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(j==a1 && i<a2)   
                c[i+1][j]=a[i][j]; 
            if(i==a2&& j<a3) 
                c[i][j+1]=a[i][j];
            if(j==a3 && i>a4)   
                c[i-1][j]=a[i][j];
            if(i==a4 && j>a1)     
                c[i][j-1]=a[i][j];}}
    return c;}

注意 c 是一个全局变量,它是要打印的二维数组。

这适用于单次旋转。

但我需要旋转矩阵 'r' 次。

为此,我尝试了这个,

for(int i=0;i<r;i++)
    {
        int a1=0;
        int a2=m-1;
        int a3=n-1;
        int a4=0;
        for(int j=0;j<l;j++)
        {
            c=rotate(c,a1,a2,a3,a4); // c was initialized to a 
            a1++;
            a2--;
            a3--;
            a4++; 
        }  
    }

但这给出了一个非常奇怪的输出,其中大部分空格都填充了整数 2。

有没有更简单的方法呢? 我正在考虑在rotate()中用c[i+r][j]替换c[i+1][j],即在rotate()中用r替换1,但即使这样,在某些地方也给出了一个带有零的奇怪输出.

public static int[][] rotate(int a[][],int a1,int a2,int a3,int a4){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(j==a1 && i+r<a2)   //a1,a2
                c[i+r][j]=a[i][j]; 
            if(i==a2 && j+r<a3) //a2,a3
                c[i][j+r]=a[i][j];
            if(j==a3 && i-r>a4)   //a3,a4
                c[i-r][j]=a[i][j];
            if(i==a4 && j-r>a1)     //a4,a1
                c[i][j-r]=a[i][j];}}
    return c;}

我应该如何解决这个问题?

这是我如何解决问题的非常高级的概述。 也许不是最有效的解决方案,所以如果您可以改进,请告诉我。

  1. 我们应该使用模来“旋转”矩阵,因此首先形成一个环阵列,从最外环开始,到最内环结束。

    在这里,我定义了环上的几个关键点: top_rightbottom_rightbottom_left ,其中每个点对应于环上的一个索引。 使用这些点来决定您从矩阵上的哪个位置映射您的点。

  2. 现在从环数组重建矩阵,使用rotations % ring_length作为指针,就像使用常规数组旋转一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM