我在算法的某个特定部分遇到问题,希望有人知道我做错了什么。
我的程序基本上是这样的:
创建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号码,以便我正确获取值。
问题以某种方式永远不会返回真实
任何想法?显然这只是代码的一部分,如果你需要更多帮助,写评论并且我将编辑:)
答案 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;
}