【问题标题】:Rotate a one-dimensional array matrix旋转一维数组矩阵
【发布时间】:2010-11-27 17:40:45
【问题描述】:

我需要一种算法用于(顺时针)旋转由一维数组表示的矩阵。
到目前为止,我找到了以下链接,但找不到任何能让我更接近所需解决方案的东西:
http://basgun.wordpress.com/2008/04/11/rotate-array/
http://www.rawkam.com/?p=1008

任何建议或线索将不胜感激!

Hristo

编辑:这是示例
(1 2 3 (顺时针旋转一圈) (7 4 1
4 5 6                          --------->                           8 5 2
7 8 9)                                                                 9 6 3)

(7 4 1 (花药顺时针旋转循环) (9 8 7
8 5 2                         ------>                                6 5 4
9 6 3)                                                                                  3 2 1)

【问题讨论】:

  • 什么意思?能举个例子吗?
  • 我不明白 clockwise 在这种情况下是什么意思...(1 2 3) - (3 2 1)...
  • 感谢您的回复!我已经修改了我的第一篇文章,所以现在你可以看到我的意思的(HTML 格式的)示例。希望这是有道理的。

标签: arrays matrix rotation dimension


【解决方案1】:

根据this 的回答,我将解决方案从二维数组更改为一维数组。这是用 C# 编写的,但应该适用于任何 C 风格的语言。

public static int[] Rotate1DSquareMatrixClockwise(int[] matrix)
{
    int size = (int)Math.Sqrt(matrix.Length);
    int[] result = new int[matrix.Length];

    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {
            result[i * size + j] = matrix[(size - j - 1) * size + i];
        }
    }

    return result;
}

此答案仅适用于方阵。旁注:要将方形二维数组中的元素作为一维数组访问,很简单:for matrix NxN: m1[i,j] = m2[i * N + j] 所以,这就是我在linked 解决方案中所做的全部更改。

【讨论】:

    【解决方案2】:

    维基百科有一篇关于“矩阵顺时针旋转”的精彩文章 (In-place matrix transposition -> Algorithms)

    您没有说您使用的是哪种语言,但在这种情况下,类 C 语言有一种很好的方式来访问“由一维数组表示的矩阵”。

    【讨论】:

    • 我使用 PHP。感谢您的链接 - 我一定会看看它,然后报告是否有任何进展。
    • 稍微澄清一下——我需要的是一种可以处理任何大小的矩阵(例如,不仅是方阵)的算法。
    【解决方案3】:

    很简单

    顺时针旋转的步骤

    1.对矩阵进行转置

    2.交换列

    /*a is the given matrix , b is the output matrix ,n is the size of the matrix*/
    System.out.println("Transpose of given matrix\n");
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                  b[i][j]=a[j][i];
                }
            }
    
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    System.out.print(b[i][j]+"\t");
                }
                System.out.println("\n");
            }
    
            System.out.println("Clockwise Rotation of given matrix\n");
    
            for(i=0;i<n/2;i++)
            {
                for(j=0;j<n;j++)
                {
    
                    sw=b[j][i];
                    b[j][i]=b[j][n-1-i];
                    b[j][n-1-i]=sw;
                }
                System.out.println("\n");
            }
    
    
            //Print the Result 
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    System.out.print(b[i][j]+"\t");
                }
                System.out.println("\n");
            }
    

    经过测试并运行良好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 2011-04-18
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多