Оптимизация кода закручивающейся матрицы - C#
Формулировка задачи:
Мне нужно отобразить матрицу до n числа в виде спирали. Что то типа:
1___2___3___4
10__11__12__5
9___8___7___6
Я решил задачу. Код программы полностью:
Я написал код который закручивает матрицу по спирали в четыре цикла for поместив его в цикл while:
Проблема такая нужно код который закручивает матрицу по спирали написать в один цикл, а не в четыре. Вообщем оптимизировать код. Ах да еще одно примечание, если матрица заполняется не полностью, оставшиеся места в матрице заполняются нулями, что то типа:
1__2__3__4
10_0__0__5
9__8__7__6
Это тоже нужно учесть при написание в один цикл.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication5 { class Program { static void CalcIndexesOfArray(out int a, out int b, out int m) // функция подсчитавающая размер матрицы согласно введенному числу n { int y, diff = -1; a = -1; b = -1; m = Convert.ToInt16(Console.ReadLine()); int[] A = { }; for (int i = 1; i <= m; i++) { y = Math.Abs((m / i) - i); if (diff == -1 || y < diff) { diff = y; a = i; b = (m % i == 0) ? m / i : m / i + 1; } } } static void Main(string[] args) { int a; // Индекс строк матрицы подсчитанный с помощью функций CalcIndexesOfArray int b; // Индекс столбцов матрицы подсчитанный с помощью функций CalcIndexesOfArray int z; // Введенное число n с консоли CalcIndexesOfArray(out a, out b, out z); int m = a; // Индекс строк матрицы int n = b; // Индекс столбцов матрицы int[,] mat = new int[m, n]; int k = 1; // Нарастающие числа в матрице по спирали int t = 0; // Меняющаяся число строк int i, j = 0; while (k <= z) { for (i = t; i < n; i++) if (k == z) { mat[j, i] = k++; } else { if (k <= z) { mat[j, i] = k++; } else { } } j = n - 1; for (i = t + 1; i < m; i++) if (k == z) { mat[i, j] = k++; } else { if (k <= z) { mat[i, j] = k++; } else { } } j = m - 1; for (i = n - 2; i >= t; i--) if (k == z) { mat[j, i] = k++; } else { if (k <= z) { mat[j, i] = k++; } else { } } j = t; for (i = m - 2; i > t; i--) if (k == z) { mat[i, j] = k++; } else { if (k <= z) { mat[i, j] = k++; } else { } } n--; m--; t++; j = t; } for (i = 0; i < mat.GetLength(0); i++) { for (j = 0; j < mat.GetLength(1); j++) Console.Write("{0,2}", mat[i, j] + "\t"); Console.WriteLine(); } Console.ReadKey(); } } }
while (k <= z) { for (i = t; i < n; i++) if (k == z) { mat[j, i] = k++; } else { if (k <= z) { mat[j, i] = k++; } else { } } j = n - 1; for (i = t + 1; i < m; i++) if (k == z) { mat[i, j] = k++; } else { if (k <= z) { mat[i, j] = k++; } else { } } j = m - 1; for (i = n - 2; i >= t; i--) if (k == z) { mat[j, i] = k++; } else { if (k <= z) { mat[j, i] = k++; } else { } } j = t; for (i = m - 2; i > t; i--) if (k == z) { mat[i, j] = k++; } else { if (k <= z) { mat[i, j] = k++; } else { } } n--; m--; t++; j = t; }
Решение задачи: «Оптимизация кода закручивающейся матрицы»
textual
Листинг программы
using System; namespace ConsoleCS { class Program { static void Main(string[] args) { var ta = FillArray(5, 6, 24); PrintArray(ta); Console.WriteLine(); Console.ReadKey(); } static int[,] FillArray(int rowCount, int columnCount, int maxNum) { int maxIndex = Math.Min(maxNum, rowCount * columnCount); int[,] arr = new int[rowCount, columnCount]; int iMin = 0, jMin = 0, iMax = columnCount - 1, jMax = rowCount - 1; int currentRow = 0, currentCol = 0; int direction = 1; // 1 - вправо, 2 - вниз, 3 - влево, 4 - вверх for (int i = 1; i <= maxIndex; i++) { arr[currentRow, currentCol] = i; switch (direction) { case 1: if (currentCol < iMax) { currentCol++; } else { direction = 2; jMin++; currentRow++; } break; case 2: if (currentRow < jMax) { currentRow++; } else { direction = 3; iMax--; currentCol--; } break; case 3: if (currentCol > iMin) { currentCol--; } else { direction = 4; iMin++; currentRow--; } break; case 4: if (currentRow > jMin) { currentRow--; } else { direction = 1; jMax--; currentCol++; } break; default: break; } } return arr; } static void PrintArray(int[,] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) { var x = arr[i, j]; Console.Write("{0} ", x < 10 ? " " + x.ToString() : x.ToString()); } Console.WriteLine(); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д