Головоломка сверху-спереди - это головоломка, в которой вам необходимо построить трехмерную (обычно кубическую) форму блоков, учитывая три ортогональных вида: вид сверху, вид спереди и вид сбоку.
Например, дан вид сверху, спереди и сбоку следующим образом:
Top: Front: Side:
. . . . . . . . . . . .
. x x . . x x . . x x .
. x x . . x x . . x x .
. . . . . . . . . . . .
In this problem, the side view is taken from the right.
Куб 2x2x2 (с объемом 8) удовлетворял бы этому решению, но это выполнимо в объеме 4, если у нас есть следующая структура слоя:
. . . . . . . .
. x . . . . x .
. . x . . x . .
. . . . . . . .
Есть также несколько неразрешимых договоренностей. Взять, к примеру:
Top: Front: Side:
. . . . . . . . . . . .
. . . . . . x . . . . .
. x . . . . . . . x . .
. . . . . . . . . . . .
Если вид сверху говорит, что блок является вторым слева, нет никакого способа, который мог бы соответствовать виду спереди, который говорит, что блок должен быть третьим слева. Так что это расположение невозможно.
Ваша задача состоит в том, чтобы создать программу, которая, учитывая произвольную головоломку 4x4 с верхней стороны, пытается решить ее за наименьшее количество кубов или объявляет ее неразрешимой.
Ваша программа примет в качестве входных данных последовательность из 48 битов, представляющих вид сверху, спереди и сбоку. Они могут быть в любом формате, который вы хотите (6-байтовая строка, строка из 0 и 1, 12-значное шестнадцатеричное число и т. Д.), Но порядок битов должен отображаться следующим образом:
Top: 0x00 Front: 0x10 Side: 0x20
0 1 2 3 0 1 2 3 0 1 2 3
4 5 6 7 4 5 6 7 4 5 6 7
8 9 a b 8 9 a b 8 9 a b
c d e f c d e f c d e f
Другими словами, биты идут в порядке слева направо, сверху вниз, сверху, затем спереди, затем сбоку.
Затем ваша программа выведет либо серию из 64 битов, указывающую заполненные кубы в сетке 4x4x4, либо указывает, что сетка неразрешима.
Ваша программа будет оценена путем запуска батареи из 1 000 000 тестовых случаев.
Тестовые данные будут получены путем взятия MD5-хешей целых чисел от «000000» до «999999» в качестве строк, извлечения первых 48 бит (12 шестнадцатеричных чисел) каждого из этих хешей и использования их в качестве входных данных для top-front- боковая загадка. В качестве примера, вот некоторые из тестовых входов и головоломок, которые они генерируют:
Puzzle seed: 000000 hash: 670b14728ad9
Top: Front: Side:
. x x . . . . x x . . .
x x x x . x . x x . x .
. . . . . x x x x x . x
x . x x . . x . x . . x
Puzzle seed: 000001 hash: 04fc711301f3
Top: Front: Side:
. . . . . x x x . . . .
. x . . . . . x . . . x
x x x x . . . x x x x x
x x . . . . x x . . x x
Puzzle seed: 000157 hash: fe88e8f9b499
Top: Front: Side:
x x x x x x x . x . x x
x x x . x . . . . x . .
x . . . x x x x x . . x
x . . . x . . x x . . x
Первые два неразрешимы, в то время как последний имеет решение со следующими слоями, спереди назад:
x . . . . . . . x x x . x x x .
. . . . x . . . . . . . . . . .
x . . . . . . . . . . . x x x x
x . . . . . . . . . . . x . . x
There are a total of 16 blocks here, but it can probably be done in less.
Оценка вашей программы будет определяться по следующим критериям в порядке убывания приоритета:
- Наибольшее количество раскрытых дел.
- Наименьшее количество блоков, необходимых для решения этих случаев.
- Самый короткий код в байтах.
Вы должны самостоятельно представить и рассчитать балл, что требует от вашей программы прохождения всех 1 000 000 тестовых случаев.