Создать и заполнить массив NxN

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

Создать и заполнить массив NxN, где N - четное число больше или равно 2, данными согласно следующим правилам. В центре матрицы блок 2х2 заполненный нулями, Далее идут строки столбцы в 1 ячейку значение которых последовательно увеличивается на 1. Помогите решить ,и если не сложно с пояснением пожалуйста! Спасибо.

Пример таблицы 4х4
1111
1001
1001
1111

Пример таблицы 6х6
222222
211112
210012
210012
211112
222222

Пример таблицы 8х8
33333333
32222223
32111123
32100123
32100123
32111123
32222223
33333333

Задачу получилось решить вот таким образом

int[][] array = new int[4][4];

        int count = 0;
        for (int i = 0; i < array.length; i++){
            for (int j = 0; j < array.length; j++){
                array[i][j] =1;
                count++;
                if (count == 6){
                    array[i][j] = 0;
                }
                if (count == 7){
                    array[i][j] = 0;
                }if (count == 10){
                    array[i][j] = 0;
                }
                if (count == 11){
                    array[i][j] = 0;
                }
            }
        }
        System.out.println(Arrays.deepToString(array));

Если заполнять так то не понятно как в центр добавить нули 0

public static int[][] buildArr(int n) {
        int[][] arr = new int[n][n];
        for (int i = 0, v = n / 2; v-- > 0; i++) {
            for (int j = i; j < n - i; j++) {
                arr[i][j] =1;       // верхняя строка
                arr[j][i] =1 ;       // левая колонка
                arr[n-1-i][j] = 1;   // нижняя строка
                arr[j][n-1-i] = 1; // правая колонка
            }
        }
        return arr;
    }

Ответы

▲ 1Принят

Способ решения:

  • Смотрим на варианты квадрата в зависимости от его размера и анализируем, какие числа должны быть в него записаны.
    Легко увидеть, что для размера 4х4 числа принадлежат диапазону [0; 1], для 6х6 -- [0; 2], и т.д., то есть для квадрата со стороной N максимальное значение можно определить как N/2 - 1.
  • Заполнение квадрата идет по убыванию значений от периферии к центру.
    Значит, можно заполнить внешние стороны текущим значением (начиная с максимума), затем уменьшить его на 1, перейти на следующую строку/столбец, которые тоже будут сокращены дополнительно на 1.
    Заполнять массив, пока текущее значение больше 0, так как массив будет заполнен нулями при создании условие).
  • Можно заполнять сразу 4 стороны квадрата.

Вариант кода:
(исправил условие v-- > 1, чтобы не изменять часть, уже заполненную нулями)

public static int[][] buildArr(int n) {   
    int[][] arr = new int[n][n];
    for (int i = 0, v = n / 2; v-- > 1; i++) {
        for (int j = i; j < n - i; j++) {
            arr[i][j] =        // верхняя строка
            arr[j][i] =        // левая колонка
            arr[n-1-i][j] =    // нижняя строка
            arr[j][n-1-i] = v; // правая колонка
        }
    }
    return arr;
}

Метод для вывода полученного массива -- используется метод Arrays.toString для каждой строки, из которой убираются все нецифровые символы при помощи String::replaceAll("\\D+", ""):

private static void out(int[][] arr) {
    System.out.println("arr " + arr.length + " x " + arr[0].length);
    for (int[] r : arr) {
        System.out.println(Arrays.toString(r).replaceAll("\\D+", ""));
    }
    System.out.println("----");
}

Аналогично, вместо цикла можно было бы использовать Stream API:

private static void out(int[][] arr) {
    System.out.println("arr " + arr.length + " x " + arr[0].length);
    Arrays.stream(arr)
        .map(Arrays::toString)
        .map(r -> r.replaceAll("\\D+", ""))
        .forEach(System.out::println);
    System.out.println("----");
}

Тесты:

out(buildArr(8));
out(buildArr(12));

Результаты:

arr 8 x 8
33333333
32222223
32111123
32100123
32100123
32111123
32222223
33333333
----
arr 12 x 12
555555555555
544444444445
543333333345
543222222345
543211112345
543210012345
543210012345
543211112345
543222222345
543333333345
544444444445
555555555555
----
▲ -3
   def f(n):
      a = [[0 for _ in range(n)] for __ in range(n)]
      for i in range(n):
         for j in range(n):
           a[i][j] = max(int(abs((n - 1) / 2 - i)), int(abs((n - 1) / 2 - j)))
      return a