Lego Land
Рисунок 1: VR вид на центр города из Lego
Как инженер по созданию городов из Lego, вы стремитесь использовать все возможные технологические преимущества, чтобы обойти конкурентов. Вы заметили, что технология виртуальной реальности становится популярной среди инженеров, и хотите внедрить нечто подобное, чтобы привлечь венчурных капиталистов. К счастью, создание VR вида на центр города из Lego несложно. Во-первых, нужно показывать только здания, высоты и расположения которых вам уже известны. Во-вторых, Lego VR отображает вид только кубической секции города, проецируя куб на одну из плоскостей, содержащих его грань. Инженеры Lego могут вращать кубическую секцию города на 90 градусов вокруг любой из осей X, Y или Z, проходящих через его центр.
Ваша задача — написать программу Lego VR, которая принимает на вход N×N матричный вид центра города и серию команд вращения, и выводит результирующий N×N матричный вид с новой перспективы. Входная матрица N×N представляет вид сверху на N×N×N куб центра города из Lego (с одной гранью куба на уровне земли).
Каждое число в матрице указывает высоту здания в соответствующем месте. Например, 0 означает отсутствие здания, а 3 — здание высотой в 3 этажа (Lego). В начальном виде сверху нет скрытых открытых пространств, здания сплошные. Вид отображает только здания, не включая землю. Любая область, не содержащая блока здания, будет иметь значение 0.
Входные данные
Вход состоит из неопределенного количества (по крайней мере одного) наборов из трех секций:
Размер сетки — одна строка с одним целым числом N (1 ≤ N ≤ 9), представляющим размер куба зданий.
Высоты зданий — массив N×N целых чисел от 0 до N (включительно). Каждая строка массива дана на отдельной строке ввода, элементы массива не разделены. Этот начальный массив N×N представляет вид сверху на N×N сплошную структуру зданий из Lego, где каждое число обозначает высоту здания в соответствующем месте. Высота 0 указывает на отсутствие Lego в данном месте.
Серия команд вращения вокруг центра N×N×N куба, содержащего Lego, одна из:
"X" — вращает вокруг горизонтальной оси в текущем виде. Куб вращается так, что верхняя грань перемещается вперед, становясь новой видимой гранью.
"Y" — вращает вокруг вертикальной оси в текущем виде. Куб вращается так, что левая грань перемещается вперед, становясь новой видимой гранью.
"Z" — вращает вокруг оси линии зрения в текущем виде. Видимая грань не меняется, но поворачивается на 90 градусов против часовой стрелки.
Эти команды представляют собой непрерывную строку длиной не более 80 команд.
Между каждым двумя наборами входных данных ровно одна пустая строка. Перед первым набором входных данных или после последнего набора входных данных пустых строк не будет.
Недопустимые входные данные не будут предоставлены.
Выходные данные
Для каждого входного случая вывод состоит из массива N×N чисел в диапазоне от 0 до N (включительно), представляющего конечный вид для каждого входного массива и связанного с ним набора вращений. Выходные массивы должны быть разделены ровно одной пустой строкой, и не должно быть пробелов после последней цифры последнего выходного массива. Аналогично, первая цифра первого выходного массива должна быть первым символом в выводе.
Не должно быть напечатано никакого лишнего вывода.
Поскольку эта программа по сути генерирует виды 3-мерных объектов, важно быть очень конкретным в описании того, как эти виды рассчитываются. Глядя на рисунок выше, обратите внимание, что куб имеет шесть сторон, верх, левую, нижнюю и правую стороны обозначены. Передняя часть — это сторона куба, ближайшая к зрителю, а задняя — сторона, наиболее удаленная от зрителя. Начальный входной вид предназначен для представления города из Lego сверху. Каждое число представляет высоту здания в этом месте (или, соответственно, максимальное расстояние от задней части куба для любого элемента Lego в этой строке и столбце). Когда куб вращается, числа больше не указывают высоту зданий, так как вид больше не обязательно является видом сверху. Вместо этого числа продолжают представлять максимальное расстояние от задней части куба для любого элемента Lego в этой строке и столбце куба. Идея заключается в том, что числа будут представлять те Lego, которые находятся ближе всего к зрителю, и, следовательно, те Lego, которые видны зрителю.