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;
}
我在算法的特定部分遇到问题,希望有人知道我做错了什么。
我的程序基本上是这样运行的:
创建 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;
}