将4x4阵列旋转180度c#

时间:2015-04-07 13:09:06

标签: c# arrays matrix rotation

嗨,我需要知道如何将数组旋转180度。目前我可以让它旋转90度,但不能让它进一步旋转。如果有人可以帮助我,那将是很好的,因为我已经被困在这个问题上几天了。谢谢,这是我的代码:

namespace Question_2_1_
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] array = new int[4, 4] {
                { 1,2,3,4 },
                { 5,6,7,8 },
                { 9,0,1,2 },
                { 3,4,5,6 } };

            int[,] rotated = RotateMatrix(array, 4);    
            var rowCount = array.GetLength(0);
            var colCount = array.GetLength(1);

            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < colCount; j++)
                {
                    Console.Write(String.Format("{0}", rotated[i, j]));
                }

                Console.Write(Environment.NewLine);
            }

            Console.ReadLine();
        }

        static int[,] RotateMatrix(int[,] matrix, int n) 
        {
            int[,] ret = new int[n, n];

            for (int i = 0; i < n; ++i) 
            {
                for (int j = 0; j < n; ++j) 
                {
                    ret[i, j] = matrix[n - j - 1, i];
                }                   
            }

            return ret;                     
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您说您想要就地旋转,但您的rotate方法会返回一个新数组。就地旋转意味着您可以修改矩阵本身,而无需创建新矩阵 但是,如果旋转90度,如果矩阵是方形的,当然只能就地旋转 但是,如果旋转180度,则可以始终就地旋转。我们采用非方矩阵:
{ a, b, c, d, e, f }, { g, h ,i, j, k, l }, { m, n, o, p, q, r }
如果我们将它旋转180度,我们最终得到:
{ r, q, p, o, n, m }, { l, k, j, i, h, g }, { f, e, d, c, b, a }
您可以看到[r,c​​]处的项目最终位于[#rows - r - 1,#column - c - 1]。 (当然是0),
所以[0,1]处的b结束于[3 - 0 - 1,6 - 1 - 1]

您可以使用的方法是:首先交换a和r,然后交换b和q等。
这类似于反转一维阵列,只有2维 就像倒转一维阵列一样,我们只走了一半:
我们交换的最后两项是i和j。
我将方法设为通用,因此您可以使用它旋转任何矩阵。

static void Rotate180<T>(T[,] matrix) {
    int rowCount = matrix.GetLength(0), columnCount = matrix.GetLength(1);
    int max = rowCount * columnCount / 2, m = 0;
    for (int r = 0; ; ++r) {
        for (int c = 0; c < columnCount; ++c) {
            Swap(matrix, r, c, rowCount - r - 1, columnCount - c - 1);
            if (++m >= max) return;
        }
    }
}

static void Swap<T>(T[,] matrix, int r1, int c1, int r2, int c2) {
    T temp = matrix[r1, c1];
    matrix[r1, c1] = matrix[r2, c2];
    matrix[r2, c2] = temp;
}

答案 1 :(得分:0)

您正在寻找的答案是:

ret[i, j] = [n - (i + 1), n - j - 1];

然而,由于您正在创建一个完全不同的阵列,因此这不是就位的&#34; ret&#34;

答案 2 :(得分:0)

首先反转列,然后是行。

class Program
{
    static void Main(string[] args)
    {
        var A = new int[,] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
        RotateMatrix180(ref A);
        // A = {{16,15,14,.. }, .. , { ..3,2,1} }
    }

    public static void RotateMatrix180<T>(ref T[,] matrix)
    {
        int n = matrix.GetLength(0), m = matrix.GetLength(1);
        if(n!=m) { /* error  */ }

        for(int i = 0; i<n; i++)
        {
            for(int j = 0; j<n/2; j++)
            {
                T temp = matrix[i, j];
                matrix[i, j]=matrix[i,n-j-1];
                matrix[i, n-j-1]=temp;
            }
        }
        for(int i = 0; i<n/2; i++)
        {
            for(int j = 0; j<n; j++)
            {
                T temp = matrix[i, j];
                matrix[i, j]=matrix[n-i-1, j];
                matrix[n-i-1, j]=temp;
            }
        }
    }

}

PS。我添加了ref关键字,以明确该函数修改现有数组。没有它,代码将一样工作,因为数组总是引用类型。