2015-04-07 2 views
0

привет, мне нужно знать, как вращать массив на 180 градусов на месте. в настоящее время я могу заставить его вращаться на 90 градусов, но просто не могу заставить его вращаться дальше. Если кто-нибудь может мне помочь, это было бы здорово, поскольку я застрял на этом вопросе уже пару дней. Спасибо, вот мой код:вращать массив 4x4 на 180 градусов C#

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;      
     } 
    } 
} 
+0

Прежде чем вводить код для таких проблем, мне нравится визуализировать его (например, с помощью ручки и бумаги). Как только вы узнаете, где заканчивается каждая запись, легко ввести код. –

+4

если вы точно знаете, что поворот на 90 градусов работает ..... сделайте это дважды. –

+0

Можете ли вы добавить ожидаемый результат в нижней части кода (как комментарии)? Я хочу четко понимать, что вы подразумеваете под вращением. – ja72

ответ

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 }
Вы можете видеть, что пункт на [г, с] заканчивается в [#rows - г - 1, #columns - c - 1]. (0 на основе конечно),
так б на [0, 1] заканчивается в [3 - 0 - 1, 6 - 1 - 1]

Метод можно использовать: во-первых подкачки а и г , затем b и q и т. д.
Это похоже на обращение к 1-мерному массиву, только в 2 измерениях.
Как и при обращении 1-мерного массива, мы переходим на полпути:
последние 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; 
} 
0

Ответ вы ищете это:

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

Однако это не на месте, как вы создаете совершенно другой массив «РЭТ»

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, чтобы было очевидно, что функция изменяет существующий массив. Код будет работать без него, потому что массивы всегда являются ссылочными типами.

Смежные вопросы