Создание двумерной матрицы

помогите решить задачу! Не получается отсортировать в правильном порядке введите сюда описание изображения


Ответы (1 шт):

Автор решения: Nowhere Man

Во-первых, метод определён не слишком корректно, он должен либо возвращать новый квадратный массив, заполненный числами в соответствии с требованиями:

public static int[][] generate(int n) {
    // ...
}

либо принимать на вход двумерный массив и заполнять его как требуется (тогда параметр, описывающий размер массива n не является необходимым):

static void fill(int[][] arr) {
    // ...
}

Задача в описанном виде подразумевает, что требуемый массив существует где-то отдельно от метода как некая глобальная переменная, к которой происходит обращение внутри метода, при этом даже название такой переменной не определено.

Также к данной задаче не относится сортировка.


Рассмотрим первый вариант решения с генерацией нужного массива как более функциональный:

  1. Создаём квадратный массив целых чисел размером n × n, сразу после создания он будет целиком заполнен нулями
  2. Создаём внешний цикл, с двумя переменными-индексами, описывающими начало диагонали и её конец, а также инициализируем счётчик для вычисления текущего значения. Первый индекс будет увеличиваться, второй -- уменьшаться.
  3. В первом вложенном цикле заполняем элементы диагонали, инкрементируя счётчик, с учётом смещения
  4. Во втором вложенном цикле заполняем оставшиеся элементы в последнем столбце снизу вверх, также с учётом смещения

Вариант решения:

static int[][] generate(int n) {
    int[][] arr = new int[n][n];
    
    for (int left = 0, right = n - 1, count = 1; left <= right; left++, right--) {
        // диагональ, начиная с первой строки и самой левой колонки
        for (int r = 0, c = left; c <= right; r++, c++) {
            arr[r][c] = count++;
        }
        // правый столбец, снизу-вверх до первой строки включительно
        for (int r = right - left - 1; r >= 0; r--) {
            arr[r][right] = count++;
        }
    }
    
    return arr;
}

Для n = 6:

1   12  19  21  18  11  
0   2   13  20  17  10  
0   0   3   14  16  9   
0   0   0   4   15  8   
0   0   0   0   5   7   
0   0   0   0   0   6   

Для n = 5:

1   10  15  14  9   
0   2   11  13  8   
0   0   3   12  7   
0   0   0   4   6   
0   0   0   0   5   
→ Ссылка