Написать программу, которая решает головоломку 8 Puzzle (и её обобщения) с использованием алгоритма A*.
https://en.wikipedia.org/wiki/15_puzzle
https://en.wikipedia.org/wiki/A*_search_algorithm
Вам необходимо реализовать неизменяемый класс доски, который будет удовлетворять следующим требованиям:
- Конструктор, принимающий массив в пространстве размерности 2, который заполнен целыми числами
- Конструктор, принимающий размер доски и генерирующий некоторое состояние на доске
- Метод size, возвращающий размер доски
- Метод hamming, возвращающий количество блоков не на своих местах
- Метод manhattan, возвращающий сумму Manhattan расстояний между блоками и целью
- Метод is_goal, который отвечает на вопрос является ли эта доска целью
- Метод is_solvable, который отвечает на вопрос, решаема ли такая расстановка элементов
- Операторы == и != для board
- Метод to_string и операторы вывода для текстового представления строк
- Такой синтаксис должен работать:
board b(3); std::cout << b[1][1] << std::endl;
, выводит элемент в ячейке (1, 1) - Конструкторы копирования и операторы присваивания должны работать корректно
Этот класс должен предоставлять интерфейс для получения цепочек досок, которые приводят к решению, и удовлетворять следующим требованиям:
- Конструктор, принимающий board, для которого нужно построить решение
- Метод moves, который выводит количество перемещений, которые приводят к решению
- Итератор, который позволяет пройтись по последовательности board, приводящей к решению
- Конструкторы копирования и операторы присваивания должны работать корректно
Если решения не существует, тогда begin() == end(). Т.е. в решении должно быть 0 досок которые приводят к решению. Если размер доски задан 0 или 1, то можно считать, что решение есть и возможно создать лишь доску-решение.
HINT: Для решения этой задачи можно использовать стандартные итераторы stl контейнеров.