Латинский квадрат представляет собой квадрат , который не повторяется символы либо X или Y столбцов . Например:
ABCD
DABC
CDAB
BCDA
один из таких квадратов. Обратите внимание, что каждый столбец и строка содержат перестановку из 4 одинаковых букв.
Тем не менее, у нашего латинского квадрата есть проблема: если бы я повернул второй ряд ( DABC
) 1 влево, я бы закончил с тем ABCD
, что идентично перестановке над ним. Если невозможно повернуть один столбец / строку и получить другой столбец / строку, то мы считаем, что квадрат безопасен для вращения .
Например:
ABCD
BDAC
CADB
DCBA
это вращение безопасно. Сетка имеет следующие свойства:
- Точка [0, N] использует N-й символ
- Точки [0, N] и [N, 0] всегда являются одним и тем же символом . (Я также хотел бы сказать, что [x, y] и [y, x] также всегда являются одной и той же буквой, но я не могу доказать это)
Ваша задача - распечатать 1 латинский квадрат, безопасный для вращения, когда передано N. Мне все равно, выводите ли вы буквы, цифры, список или двумерный массив. Если вы используете числа, верхний столбец и строка должны быть 0,1,2,3,...
(в этом порядке). Если вы используете буквы, то это должно бытьA,B,C,D,....
Например, если вы ввели 4, вы должны вывести:
0,1,2,3 0,1,2,3
1,3,0,2 or 1,0,3,2
2,0,3,1 2,3,1,0
3,2,1,0 3,2,0,1
Нет безопасных для поворота латинских квадратов размером менее 4. Мне все равно, что делает ваша программа, если N меньше 4. Для любопытных, число безопасных для поворота квадратов равно (начиная с 4): 2,5,5906,(too long to calculate)
Это код-гольф , поэтому постарайтесь сделать ответы максимально короткими на вашем любимом языке!
1,2,3,...
?
N
за недостаточного качества случайных чисел?)