Цель состоит в том, чтобы построить этот шаблон, где N находится в диапазоне [4100]. Главные диагонали всегда 'a'
, соседи a
должны быть b
, соседи b
должны быть c
и так далее. Если мы уже перешли к символу z
— переключаемся на a
обратно.
Код ниже представляет собой попытку построить более простой шаблон, но диагонали идут от нижнего левого угла к верхнему правому, я очень плохо разбираюсь в индексах:\
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]
Я полагал, что диагонали имеют равные суммы индексов каждого элемента, расположенного на указанной диагонали, однако есть еще один шаблон, в котором используется средний центральный крест, он действует как линия симметрии, но вычисление формулы индексов для матричных квадрантов выходит за рамки моя лига.
Любые советы, пожалуйста?
Какая у вас забавная проблема. Я думаю, что нашел решение, но сначала позвольте мне объяснить, как я это придумал.
Вместо динамического изменения символа я подумал, что можно просто перебрать все элементы матрицы и определить символ на основе некоторой арифметики.
Кажется, как вы указали, что ваша матрица на самом деле очень симметрична и что четыре квадранта связаны между собой. Это означает, что вы можете пройти половину своей матрицы только в обоих направлениях и установить сразу четыре элемента с нужным символом (по одному в каждом квадранте).
Начав с четного размера матрицы для простоты, вы можете найти формулу, которая соответствует символу с индексом 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, вам, кстати, придется немного адаптировать предыдущий ответ (я думаю, где-то добавив модуль).