алгоритм — Решение головоломки 3х3 с помощью PHP с использованием поиска в ширину

я делаю решатель головоломок 3х3 используя php. Ноль — это свободное пространство, куда вы можете двигаться. Например:

1 2 3
4 0 5
7 8 6

к

1 2 3
4 5 0
7 8 6

к

1 2 3
4 5 6
7 8 0

Я уже сделал генератор случайных чисел — сделано 50 случайных ходов. Но я стек, с алгоритмом решателя.

На выходе должны быть все шаги для его решения.

У меня уже есть рабочий метод для решения одношаговой головоломки, но я не знаю, как использовать его рекурсивно.

public function makeMoves($elements)
{
$pos = $this->findSpace($elements); //returns position of the free space

$actions = $this->findActions($pos); //returns all actions positions (left, right, top, bottom)

$possibleActions = $this->findPossibleActions($actions); //return number of possible actions

for ($i = 1; $i <= $possibleActions; ++$i) { //let's do all possible actions
$move = $this->selectAction($actions, $i, $pos); //get new position for the space
$perform = $this->performAction($elements, $pos, $move); //swap the space with the element on that position

$this->tree[] = new Elements;

end($this->tree);
$last_id = key($this->tree);

$this->tree[$last_id]->setState($perform);
$this->tree[$last_id]->setAncestor(0);

$step = [$move, $pos];

$this->tree[$last_id]->setStep($step);

if ($perform == $this->elementsDone) {
return $this->tree[$last_id];
}
}
}

1

Решение

Одним из решений является использование алгоритма A *, чтобы найти кратчайший путь к решению. Каждый ход имеет стоимость 2. Каждая позиция имеет расстояние от желаемого решения суммы расстояний, которые должен пройти каждый кусок. (Один угол к другому — это расстояние 4.) Вы гарантированно найдете самое короткое решение, если оно есть.

Увидеть http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript для реализации этого алгоритма.

Имейте в виду, что половина всех случайных конфигураций НЕ будет разрешимой. Увидеть https://www.cs.bham.ac.uk/~mdr/teaching/modules04/java2/TilesSolvability.html для теста, чтобы сказать вам, какие из них выбросить. Он также дает советы о том, как написать алгоритм, который занимает меньше памяти, чем предложенный мною, и находит неэффективные решения, но будет выполнять меньше работы, чтобы найти эти решения.

1

Другие решения

Других решений пока нет …