Оптимизация кода закручивающейся матрицы - C#

Узнай цену своей работы

Формулировка задачи:

Мне нужно отобразить матрицу до n числа в виде спирали. Что то типа: 1___2___3___4 10__11__12__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();
        }
    }
}
Я написал код который закручивает матрицу по спирали в четыре цикла for поместив его в цикл while:
 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;
            }
Проблема такая нужно код который закручивает матрицу по спирали написать в один цикл, а не в четыре. Вообщем оптимизировать код. Ах да еще одно примечание, если матрица заполняется не полностью, оставшиеся места в матрице заполняются нулями, что то типа: 1__2__3__4 10_0__0__5 9__8__7__6 Это тоже нужно учесть при написание в один цикл.

Решение задачи: «Оптимизация кода закручивающейся матрицы»

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();
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.6 из 5