PHP 中的数独 solving/generating 算法

Sudoku solving/generating algorithm in PHP

我在算法的特定部分遇到问题,希望有人知道我做错了什么。

我的程序基本上是这样运行的:

创建 81 个空单元格,每一步填充每个单元格步骤,同时检查它在那里是否有效。

我有 3 个有效检查,水平有效检查(如果 1 行中的数字是两倍或更多)已经给我带来麻烦。

这是我的功能:

private function isValidHorizontal($index)
    {
        for ($i = 0; $i < 81; $i += 9){

            $firstIndex = $i * 9;
            $lastIndex = 9 * ($i + 1) - 1;

            // fisrt loop tracking fowards, 2nd loop tracking backwards
            if ($index >= $i && $index <= $lastIndex) {
                for ($j = 0; $j <= $lastIndex; $j++) {
                    if ($this->cell[$index]->getValue() == $j) {
                        return false;
                    }
                }
                for ($k = 0; $k >= $firstIndex; $k--){
                    if ($this->cell[$index]->getValue() == $j) {
                        return false;
                    }
                }
            }
        }

        return true;
    }

$index 是单元格的位置,所以当 $index = 0 时那将是第一个单元格。最后一个单元格是 $index = 80

$this->cell[$index]->getValue() returns 我检查了一个整数,所以我得到的值是正确的。

问题永远不会 returns 正确

有什么想法吗?显然这只是代码的一部分,如果您需要更多帮助,请发表评论,我会进行编辑:)

在第二个内部循环中,您使用 $j 而不是 $k:

for ($k = 0; $k >= $firstIndex; $k--){
    if ($this->cell[$index]->getValue() == $j) { // Here, change to $k

你已经从@this.lau_那里得到了正确的答案,但如果我可以提供一些建议,你可以通过改变逻辑来缩短它。 PHP 并不是最适合这个的语言,所以它看起来还是有点笨拙,但我可能值得一看。 :)

private function isValidHorizontal($index) {
    $taken = [];
    foreach (range($index, 81, 9) as $i) {
        $value = $this->cell[$i]->getValue();
        if (is_int($value) && in_array($value, $taken)) {
            return false;
        }
        $taken[] = $value;
    }
    return true;
}