我最近想看看我是否能够在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文件:
修改 sudoku2.php
提前致谢。
答案 0 :(得分:2)
这是你的主要问题:
if the value is bigger than 9:
return solve($cell--, $value_prev);
当你到达那一点(没有任何作用,所以你必须回去并改变之前的东西)时,你不能像你一样更深入地进行递归,因为你的筹码会随着错误的累积而变得太大。您需要实际返回到先前的堆栈级别并继续从那里开始。
E.g。如果完成,您可以solve
返回TRUE
,如果选项用完,可以FALSE
。solve
然后,每当您递归调用TRUE
时,如果它返回TRUE
,则返回FALSE
,如果它返回$value++
,则会使用{{1}}再次调用{{1}}。