2015-09-16 2 views
3

У меня возникают проблемы с определенной частью моего алгоритма, и я надеялся, что кто-то имеет представление о том, что я делаю неправильно.Судоку решения/генерации алгоритма в 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() возвращает номер int, который я проверил, чтобы получить правильное значение.

проблема это как-то никогда не возвращает истинное

Есть идеи? Очевидно, это только часть кода, если вам нужно больше, чтобы помочь, написать комментарий, и я буду править :)

ответ

1

Во втором внутреннем цикле вы используете $j вместо $k:

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

проклятье. Теперь я чувствую себя глупо. теперь отлично работает! – gempir

+0

любая идея, почему мой код теперь останавливается в ячейке 9? Ячейка 9 является первой ячейкой второй строки, поэтому она не должна работать с ошибкой – gempir

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; 
} 
+0

. Я получаю то, что вы хотите сделать, и это сделает ее намного более эффективной, но я уже получаю недопустимое значение в самой первой ячейке – gempir

+0

Да, я не мог протестировать код, так как у меня нет вашего объекта, поэтому я имел в виду только шаблон приблизительной идеи. Извини за это. Но, по крайней мере, вы получили код от другого ответа. :) –

Смежные вопросы