使用广度优先搜索使用PHP解决3x3拼图

时间:2016-02-25 17:28:06

标签: php algorithm breadth-first-search 8-puzzle

我正在使用php制作3x3拼图解算器。零是可以移动的自由空间。例如:

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 个答案:

答案 0 :(得分: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进行测试,告诉您要丢弃哪些测试。它还提供了如何编写算法的提示,该算法占用的内存少于我建议的算法并找到效率低下的解决方案,但是找到这些解决方案的工作量会减少。