php easy sudoku solver使用回溯

时间:2012-04-05 01:04:02

标签: php sudoku backtracking

我最近想看看我是否能够在php中解决一个简单的数独(最初)。我知道php并不是编程原因的选择,但我知道php最好,我在java和c中遇到了设计问题。尽管如此,我认为它没有任何理由不起作用。

首先我不想问你,因为那里有一些解决的线程。但我发现这些解决方案太复杂了,我无法理解(其他语言,复杂的结构),也不符合我的目标。

我的问题是:有人可以根据我的目标给我一个提示吗?我想要一个简单的数独求解器而不需要猜测,只需要回溯。

算法如下所示:

$cell;  // 1-81 - as parameter of the recursive function solve()
$value; // 1-9  - as parameter ...

class Sudoku {

function solve($cell = 1, $value = 1) {

    // skipping values

    if the current cell is fix:

        return solve(cell++, $value);

    // testing values (logic)

    if not:

        if the value is within the square (3x3) itself:

            return solve($cell, $value++);

        if the value is within the row:

            return solve($cell, $value++);

        if the value is within the col:

            return solve($cell, value++);

        if the value is bigger than 9:

            return solve($cell--, $value_prev);

        // all test passed, add the new value to list
        $this->values[$cell] = $value;

        if all fields are filled:
            return;

        if there are fields left:
            return solve($cell++, 1);
}
}

如果我创建一个空白的数据,它将正确地填充到单元格43.脚本崩溃并发生致命错误:致命错误:允许的内存大小为134217728字节耗尽(尝试分配261904字节)。

值填写如下:

1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 7 8 9 | 1 2 3
7 8 9 | 1 2 3 | 4 5 6
2 1 4 | 3 6 5 | 8 9 7
3 6 5 | 2 1 4 | 。 。点。

我猜有一个无限循环或导致此崩溃的东西。也许这是不可解决的。我只是想知道我做得对,还是忘了检查。 我也用easy-sudoku的固定值尝试了这个算法。它也崩溃了......也许有很多回溯。

最后,我想说我并不反对更好的解决方案,但我只想让它发挥作用。 如果你不能给我一个基于此的答案,你可以看一下php文件:

sudoku.php

修改 sudoku2.php

提前致谢。

1 个答案:

答案 0 :(得分:2)

这是你的主要问题:

if the value is bigger than 9:
    return solve($cell--, $value_prev);

当你到达那一点(没有任何作用,所以你必须回去并改变之前的东西)时,你不能像你一样更深入地进行递归,因为你的筹码会随着错误的累积而变得太大。您需要实际返回到先前的堆栈级别并继续从那里开始。

E.g。如果完成,您可以solve返回TRUE,如果选项用完,可以FALSEsolve然后,每当您递归调用TRUE时,如果它返回TRUE,则返回FALSE,如果它返回$value++,则会使用{{1}}再次调用{{1}}。