Skip to content

Latest commit

 

History

History

engine

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Система решения головоломок типа замощения плитками

Основная процедура решения головоломки находится в модуле solver.py и реализвана в виде функции-генератора solutions.

Для получения решения функции передаются объект доски board и набор фигур piece_set.

Объект доски типа Board хранит размеры доски и двоичную маску занятых ячеек. Маска представляет собой целое число, при этом установленный бит соответствует занятой ячейке доски, а погашенный - свободной. Битовая маска получается построчной разверткой ячеек доски сверху вниз и слева направо. Младший бит соответствует правому нижнему углу доски. Ячейки могут быть заняты блоками, создаваемыми вместе с игрой, или установленными игроком фигуарми.

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

Набор фигур организован в ввиде списка элементов по числу доступных для установки фигур. Каждый элемент в свою очередь представляет собой список длиной равной количеству ячеек на доске. Для каждой позиции в наборе хранится список масок фигур, которые можно установить в данную позицию (без учета наложения на уже установленные фигуры).

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

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

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