如何顺时针旋转C#m * n矩阵?

时间:2018-04-04 01:14:53

标签: c#

我有一个旋转动态平方数组的类。我只需要平方旋转。目前,它只能向左旋转。我还需要它向右旋转。

这个答案提供了一个逆时针旋转的解决方案,我的修改版本低于我的需要,但我对如何反向做了很多。

Rotate M*N Matrix (90 degrees)

我可以调用RotateLeft()3x,但当然,这是低效的。我想了解另一种解决方案。

我的代码:

public void RotateLeft()
{
    m_array = RotateMatrixCounterClockwise(m_array, m_width, m_height);
}

public void RotateRight()
{ 
} 

public static T[] RotateMatrixCounterClockwise(T[] oldMatrix, int width, int height)
{ 
    T[] newMatrix = new T[width * height];
    int newColumn, newRow = 0;
    for (int oldColumn = height - 1; oldColumn >= 0; oldColumn--)
    {
        newColumn = 0;
        for (int oldRow = 0; oldRow < width; oldRow++)
        {
            newMatrix[newRow * width + newColumn] = oldMatrix[oldRow * width + oldColumn];
            newColumn++;
        }
        newRow++;
    }

    return newMatrix;
} 

解决方案:

感谢Daniel,这段代码将来可能对其他人有用。唯一改变的是内部块:

newMatrix[oldRow * width + oldColumn] = oldMatrix[newRow * width + newColumn];

完整代码:

public static T[] RotateMatrixClockwise(T[] oldMatrix, int width, int height)
{ 
    T[] newMatrix = new T[width * height];
    int newColumn, newRow = 0;
    for (int oldColumn = height - 1; oldColumn >= 0; oldColumn--)
    {
        newColumn = 0;
        for (int oldRow = 0; oldRow < width; oldRow++)
        {
            newMatrix[oldRow * width + oldColumn] = oldMatrix[newRow * width + newColumn];
            newColumn++;
        }
        newRow++;
    }

    return newMatrix;
}

1 个答案:

答案 0 :(得分:1)

交换oldRownewRow的角色,类似于列。