Все мы помним, что такое стек -- структура, которая умеет удалять из конца и добавлять в конец. Для скорости можно использовать массивы, pop() и append()
Если введённая расстановка имеет решение, то следуем следующему алгоритму:
Выбираем стопку-склад, в которую будем складывать все контейнеры, например первую.
проходим каждую стопку, кроме складной, и, если верхнюю нельзя положить в свою стопку, то есть, там есть какие-то лишние ящики, кладём её в склад-стопку, иначе - в свою стопку.
Делее - выбираем резервную стопку, например последнюю, в которую будем класть контейнеры первого типа.
Берём верхний контейнер со стопки-склада и, если он не является первым - кладём его в свю стопку, иначе - кладём в резервную, запоминая этот ход, когда в первой стопке будет контейнер из резервной стопки, кладём его в любую стопку, отличную от склада и резервной, потом перекладываем контейнер из резервной в первую, и ставим на место контейнер из резервного типа.
Так поступаем до тех пор, пока в стопке-складе не останутся все контейнеры этого типа. Далее проверяем, есть ли такие контейнеры в резервной, и если есть - просто перекладываем их на место.
Все перекладывания делаем до тех пор, пока наверху лежит контейнер данного типа.