В прошлую пятницу на французском конкурсе программирования нам была задана проблема с бумажной складкой, которая была следующей:
- Учитывая квадратный лист бумаги и складной узор, напишите функция "fold (pattern)", которая даст порядок слоев, которые будет результатом совокупного складчатости (пополам) листа в уважения к образцу. "
Это может быть не совсем понятно, так что позвольте мне немного объяснить (имея квадратный лист бумаги, который может помочь понять, если вы готовы пойти так далеко, чтобы помочь мне:)).
Предположим, что у нас есть квадратный лист бумаги, на который мы рисуем сетку N * N, а затем набираем все ее внутренние квадраты. Учитывая шаблон "LTRB", мы будем складывать эту бумагу вертикально пополам и помещать полученную левую часть в правую часть. Затем мы сложим его горизонтально и положим верхнюю часть на нижнюю часть. Затем мы снова складываем его вертикально и помещаем правую часть в левую часть. Наконец, мы сложим его горизонтально и поместим нижнюю часть в верхнюю часть. Это оставляет нам лист бумаги, размер которого составляет один квадрат и N ^ 2 слоя. Ожидаемый ответ - это результирующий порядок каждого исходного квадрата.
Например, если мы нарисуем сетку 2 * 2 на квадратном листе бумаги, а затем подсчитаем каждый внутренний квадрат от 1 до 4 (сверху слева направо, горизонтально) и зададим шаблон "LT", мы бы это имели место:
fold("LT"):
1 | 2 L 1,2 T
---|--- ==> --- ==> 2,1,3,4
3 | 4 3,4
и с шаблоном "RB", например:
fold("RB"):
1 | 2 R 2,1 B
---|--- ==> --- ==> 3,4,2,1
3 | 4 4,3
Как вы, наверное, догадались, в основном сводится к рекурсивному преобразованию матрицы N * N. Это была легкая часть, и вот мое решение:
Теперь идет интересная часть.
- Напишите функцию разворачивания (порядка), которая будет, для заданного результирующего слоя упорядочивая, дайте шаблон, который произвел это упорядочение. Обратите внимание, что развернуть (fold ( "LRTB" )) = > "LRTB"
И тогда мой мозг прекратил работать некоторое время, и у меня не было времени (2 часа осталось от 4 часов), чтобы придумать достаточно быстрое решение.
Мои первоначальные идеи:
-
Попробуйте переборщить его. Поскольку мы знаем, что длина ввода N ^ 2, мы можем создать начальную матрицу и попробовать все возможное сгибание до тех пор, пока мы не достигнем того же порядка, что и вход. O (4 ^ N), не являются жизнеспособными.
-
Перемещение в обратном направлении. Начните с ввода и попробуйте все возможности разворачивания, пока мы не достигнем правильного начального состояния. Чуть лучше, но все же слишком медленно.
-
???
У кого-нибудь есть идея?