Сделать функцию, которая заполнит переданный двумерный массив состоящий из целых чисел по шаблону

Рейтинг: -1Ответов: 2Опубликовано: 19.01.2023

Шаблон: введите сюда описание изображения

Не особо понимаю как это можно реализовать , да и как она строится тоже. Извините за кривую картинку.

Ответы

▲ 0Принят

Предположим, имеется массив array, в котором n строк и m столбцов, а также есть счетчик k.

Заполняем каждую четную (i % 2 == 0) строку:

array[i][j] = k++;

Заполняем каждую нечетную строку (i % 2 == 1) в обратном порядке:

array[i][m - j - 1] = k++;

То есть заполнение массива можно реализовать примерно следующим образом:

private void fill(int[][] array, int n, int m) {
    int k = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int jj = i % 2 == 0 ? j : m - j - 1;
            array[i][jj] = k++;
        }
    }
}
▲ 0

Может быть два варианта решения для заполнения прямоугольного массива с размерностью r x n (r - количество строк, c - количество столбцов) числами в диапазоне v ∈ [0 .. r * c - 1]:

  1. Идти от "конца" массива arr[r - 1][c - 1] к началу arr[0][0] с инкрементом v
  2. Идти от "начала" массива arr[0][0] к концу arr[r - 1][c - 1] с декрементом v

Для нечётного числа столбцов выбор направления неважен, а для чётного результаты будут отличаться.

Прохождение по массиву выполняется при помощи обычного вложенного цикла, но с учётом "вертикальности" змейки, внешний цикл проходит по столбцам, а внутренний -- по строкам. Индекс строки будет "переворачиваться" для каждого второго столбца.

  • Вариант 1:
public static void fillInc(int[][] arr) {
    int v = 0;
    int r = arr.length;
    int c = arr[0].length;
    boolean d = true;
    
    for (int i = c; i-- > 0; ) {
        for (int j = r; j-- > 0; ) {
            int jj = d ? j : r - j - 1;
            arr[jj][i] = v++;
        }
        d = !d;
    }
}
  • Вариант 2:
public static void fillDec(int[][] arr) {
    int r = arr.length;
    int c = arr[0].length;
    int v = r * c - 1;
    boolean d = true;
    
    for (int i = 0; i < c; i++) {
        for (int j = 0; j < r; j++) {
            int jj = d ? j : r - j - 1;
            arr[jj][i] = v--;
        }
        d = !d;
    }
}

Тесты:

int[][] arr = new int[4][7];
fillInc(arr);
print(arr);

arr = new int[5][6];
fillInc(arr);
print(arr);

arr = new int[5][6];
fillDec(arr);
print(arr);

Результаты

[27, 20, 19, 12, 11, 4, 3]
[26, 21, 18, 13, 10, 5, 2]
[25, 22, 17, 14, 9, 6, 1]
[24, 23, 16, 15, 8, 7, 0]

----------

[25, 24, 15, 14, 5, 4]
[26, 23, 16, 13, 6, 3]
[27, 22, 17, 12, 7, 2]
[28, 21, 18, 11, 8, 1]
[29, 20, 19, 10, 9, 0]

----------

[29, 20, 19, 10, 9, 0]
[28, 21, 18, 11, 8, 1]
[27, 22, 17, 12, 7, 2]
[26, 23, 16, 13, 6, 3]
[25, 24, 15, 14, 5, 4]

----------

Ответ на похожий вопрос про "змейку" в квадратном массиве