Задача H. Куб со спицами

Автор:Г. Гренкин   Ограничение времени:2 сек
Входной файл:input.txt   Ограничение памяти:64 Мб
Выходной файл:output.txt  

Условие

Возьмём N3 одинаковых кубиков. Раскрасим кубики в N цветов так, чтобы в каждый цвет было раскрашено ровно N2 кубиков. Сложим из всех кубиков один большой куб. Начнём протыкать этот куб спицами параллельно его рёбрам. Любая спица пройдёт сквозь ровно N кубиков.

Требуется сложить куб так, чтобы любая спица проходила сквозь кубики всех N цветов.

Формат входного файла

Во входном файле содержится единственное натуральное число N.

Формат выходного файла

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

Ограничения

1 ≤ N ≤ 100

Примеры тестов

Входной файл (input.txt) Выходной файл (output.txt)
1
2
1 2
2 1
2 1
1 2

Разбор

Сперва рассмотрим задачу с квадратом: требуется расставить в клетках квадратной таблицы N × N числа от 1 до N так, чтобы в каждой строке и в каждом столбце встречались все N чисел (каждое число по одному разу). Таблица, заполненная таким образом, называется латинским квадратом.

Как построить латинский квадрат N × N? Запишем в первой строке числа от 1 до N. Во второй строке запишем числа на единицу больше, чем стоящие выше. При этом, если сверху стоит число N, то снизу будет стоять 1. Следующие строки заполняются аналогично.

1 2 3
2 3 1
3 1 2

Заметим, что число, стоящее в i-й строке и j-м столбце, можно вычислить по формуле 1 + (i + j)mod N.

Перейдём к задаче с кубом. Будем заполнять куб от ближней грани к дальней. Ближайшую к нам грань заполним так, как мы заполняли квадрат, а следующую грань заполним следующим образом: прибавим к числам, стоящим на ближайшей грани, единицу. Следующие грани заполняются аналогично.

1 2 3
2 3 1
3 1 2

2 3 1
3 1 2
1 2 3

3 1 2
1 2 3
2 3 1
Напишем программу.
program cube;
var
  n: integer;
  i, j, k: integer;
begin
  read(n);

  for k := 1 to n do
  begin
    for j := 1 to n do
    begin
      for i := 1 to n do
        write(1 + (i+j+k) mod n, ' ');
      writeln;
    end;
  end;
end.

0.087s 0.010s 13