【问题标题】:rotate a 4x4 array by 180 degrees c#将 4x4 数组旋转 180 度 c#
【发布时间】:2015-04-07 13:09:06
【问题描述】:

您好,我需要知道如何将阵列原地旋转 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;                     
        }
    }
}

【问题讨论】:

  • 在为此类问题输入代码之前,我喜欢将其可视化(例如,使用笔和纸)。一旦您知道每个条目的结束位置,输入代码就很容易了。
  • 如果你确定旋转 90 度有效的话......做两次。
  • 您能否在代码底部添加预期结果(作为 cmets)?我想清楚你所说的轮换是什么意思。

标签: c# arrays matrix rotation


【解决方案1】:

您说您想就地旋转,但您的旋转方法返回一个新数组。就地旋转意味着您可以修改矩阵本身,而无需创建新矩阵。
但是,如果要旋转 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, #columns - 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;
}

【讨论】:

    【解决方案2】:

    您正在寻找的答案是:

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

    但是,这不是就地的,因为您正在创建一个完全不同的数组“ret”

    【讨论】:

      【解决方案3】:

      先反转列,然后反转行。

      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 关键字,以使函数修改现有数组变得明显。没有它,代码也一样,因为数组总是引用类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 1970-01-01
        相关资源
        最近更新 更多