Оптимизация кода закручивающейся матрицы - 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();
}
}
}
}