Латинський квадрат представляє собою квадрат , який не повторюється символи або X або Y стовпців . Наприклад:
ABCD
DABC
CDAB
BCDA
є одним таким квадратом. Зверніть увагу, як кожен стовпець і рядок містить перестановку з тих же 4 літер.
Однак у нашого латинського квадрата є проблема: якби я повернув другий рядок ( DABC
) 1 ліворуч, я б закінчився ABCD
, що ідентично перестановці над ним. Якщо неможливо обернути жоден 1 стовпчик / рядок і отримати інший стовпець / рядок, тоді ми вважаємо квадрат безпечним для обертання .
Наприклад:
ABCD
BDAC
CADB
DCBA
безпечне обертання. Сітка має такі властивості:
- Точка [0, N] використовує N-й символ
- Точки [0, N] і [N, 0] завжди є одним і тим же символом . (Я також хотів би сказати, що [x, y] і [y, x] - теж завжди одна і та сама літера, але я не можу це довести)
Ваше завдання - роздрукувати 1 безпечний для обертання латинський квадрат, коли він пройшов N. Мені все одно, чи виводите букви, цифри, список або 2D масив. Якщо ви використовуєте цифри, верхній стовпець і рядок повинні бути 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
через недостатню якість випадкових чисел?)