Помогите скорректировать код для использования разных переменных столбцов и строк

Рейтинг: 0Ответов: 1Опубликовано: 21.04.2023

Написал код, который заполняет массив порядковыми числами по спирали, начиная с array[0,0] которому дается значение 1.

Но он работает только при условии, что кол-во столбцов и строк равны. не пойму как изменить, чтобы работало с разными переменными строк и столбцов (например 3 строки, 4 столбца)

int[,] GetSpiral2(int[,] result)
{
    int temp = 1;
    int i = 0;
    int j = 0;
    while (temp <= result.GetLength(0) * result.GetLength(1))
    {
        result[i, j] = temp;
        temp++;
        if (i <= j + 1 && i + j < result.GetLength(1) - 1)
            j++;
       else if (i < j && i + j >= result.GetLength(0) - 1)
            i++;
       else if (i >= j && i + j > result.GetLength(1) - 1)
            j--;
       else
            i--;
    }
    return result;
}

Ответы

▲ 0Принят

По большому счету, если представить двумерную матрицу как вложенные прямоугольники, то вам надо просто обойти каждый прямоугольник по контуру.

Например, если матрица 5х4

00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00

то это просто вложенные пямоугольники 5х4 и 3х2, пример:

xx xx xx xx
xx yy yy xx
xx yy yy xx
xx yy yy xx
xx xx xx xx

далее, зная ширину, высоту и верхний левый угол, мы пройдем сначала внешнмй пямоугольник, потом повторим тот же самый алгоритм для внутреннего

01 02 03 04
14 yy yy 05
13 yy yy 06
12 yy yy 07
11 10 09 08

Внутренний

01 02 03 04
14 15 16 05
13 20 17 06
12 19 18 07
11 10 09 08

Ну теперь дело за малым, построим функцию, которая так проходит по матрице

private void SpiralFill(int[,] array)
{
    var total = array.GetLength(0) * array.GetLength(1);
    var curr = 1;

    int xPos = 0;
    int yPos = 0;

    int h = array.GetLength(0);
    int w = array.GetLength(1);

    while (total >= curr)
    {
        for (int i = 0; i < w; i++)
            array[xPos, yPos + i] = curr++;

        for (int i = 1; i < h; i++)
            array[xPos + i, yPos + w - 1] = curr++;

        for (int i = 1; i < w && curr <= total; i++)
            array[xPos + h - 1, (yPos + w - 1) - i] = curr++;

        for (int i = 1; i < h - 1 && curr <= total; i++)
            array[(xPos + h - 1) - i, yPos] = curr++;
        xPos++;
        yPos++;
        h -= 2;
        w -= 2;
    }
}

Естесственно, мы 2 раза по одним и тем же ячейкам не ходим, потому мы оставновимся, когда пройдем все ячейки матрицы.

Ну, для проверки, накатаем функцию вывода матрицы на печать

private void Print(int[,] array)
{
    for (int i = 0; i < array.GetLength(0); i++)
    {
        for (int j = 0; j < array.GetLength(1); j++)
            Console.Write($"{array[i, j]:00} ");
        Console.WriteLine();
    }
}

Ну и проверка

var array = new int[10, 5];
SpiralFill(array);
Print(array);

Console.WriteLine();

array = new int[5, 10];
SpiralFill(array);
Print(array);

Вывод

01 02 03 04 05 
26 27 28 29 06 
25 44 45 30 07 
24 43 46 31 08 
23 42 47 32 09 
22 41 48 33 10 
21 40 49 34 11 
20 39 50 35 12 
19 38 37 36 13 
18 17 16 15 14 

01 02 03 04 05 06 07 08 09 10 
26 27 28 29 30 31 32 33 34 11 
25 44 45 46 47 48 49 50 35 12 
24 43 42 41 40 39 38 37 36 13 
23 22 21 20 19 18 17 16 15 14