Заполнение матрицы символами, чтобы они образовывали аккуратный крест, где каждая меньшая диагональ равна (char + 1)

Заполнение матрицы символами, чтобы они образовывали аккуратный крест, где каждая меньшая диагональ равна (char + 1)

Цель состоит в том, чтобы построить этот шаблон, где N находится в диапазоне [4100]. Главные диагонали всегда 'a', соседи a должны быть b, соседи b должны быть c и так далее. Если мы уже перешли к символу z — переключаемся на a обратно.

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

Заполнение матрицы символами, чтобы они образовывали аккуратный крест, где каждая меньшая диагональ равна (char + 1)

import java.util.*;

class Solution {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int number = sc.nextInt();

        char[][] array = new char[number][number];

        char paint = 'a';

        for (int t = 0; t < (number * number - 2); t++) {
            for (int k = 0; k < number; k++) {
                for (int j = 0; j < number; j++) {
                    if (k + j == t) {
                        array[k][j] = paint;
//                        System.out.print(array[k][j] + " ");
                    }
                }

            }
            if (paint == 123) {
                paint = (char) 97;
            } else {
                paint += 1;
            }
            

        for (char[] row : array)
        {
            System.out.println(Arrays.toString(row));
        }
    }
}

графики для n = 5:

[a, b, c, d, e]
[b, c, d, e, f]
[c, d, e, f, g]
[d, e, f, g, h]
[e, f, g, h, i]

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

Любые советы, пожалуйста?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Какая у вас забавная проблема. Я думаю, что нашел решение, но сначала позвольте мне объяснить, как я это придумал.

Вместо динамического изменения символа я подумал, что можно просто перебрать все элементы матрицы и определить символ на основе некоторой арифметики.

Кажется, как вы указали, что ваша матрица на самом деле очень симметрична и что четыре квадранта связаны между собой. Это означает, что вы можете пройти половину своей матрицы только в обоих направлениях и установить сразу четыре элемента с нужным символом (по одному в каждом квадранте).

Начав с четного размера матрицы для простоты, вы можете найти формулу, которая соответствует символу с индексом i,j в верхнем левом квадранте. Это формула, которая определяет indexLetter. Используя симметрию, вы можете установить каждый соответствующий элемент в других квадрантах напрямую.

Если вам нужна матрица нечетного размера, это почти то же самое, за исключением того, что вам нужно взять (N+1)/2 вместо N/2.

Это дает следующий результат:

import java.util.*;

class Solution {

    final static String alphabet = "abcdefghijklmnopqrstuvwxyz";

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int number = sc.nextInt();

        char[][] array = new char[number][number];

        for(int i = 0; i < Math.floor((number+1)/2); i++)
        {    
            for (int j = 0; j < Math.floor((number+1)/2); j++)
            {
                //determine the index of the right character 
                //using some arithmetics

                //next number works for both even and odd inputed number
                int nbLetters = (int)Math.floor((number+1)/2);
                int indexLetter = Math.abs(j - i) % nbLetters;
                
                //set it back in all parts of the graphs
                array[i][j] = alphabet.charAt(indexLetter);
                array[i][number-j-1] =  alphabet.charAt(indexLetter);
                array[number-i-1][j] =  alphabet.charAt(indexLetter);                
                array[number-i-1][number-j-1] =  alphabet.charAt(indexLetter);
            }
        }

        //print it back
        for (char[] row : array)
        {
            System.out.println(Arrays.toString(row));
        }
    }
}

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

Другие вопросы по теме