在PHP中的数独求解/生成算法

时间:2015-09-16 18:41:43

标签: php algorithm sudoku solver

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

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

创建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()返回我检查的int号码,以便我正确获取值。

问题以某种方式永远不会返回真实

任何想法?显然这只是代码的一部分,如果你需要更多帮助,写评论并且我将编辑:)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

你已经从@ 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;
}