2014-12-29 3 views
0

Я пробовал это решение sudoku http://www.emanueleferonato.com/2008/12/09/sudoku-creatorsolver-with-php/. Он работает нормально.Блок сканирования на sudoku решатель объяснения

Также см эту таблицу, чтобы увидеть больше деталей в расчете: spreadsheet

Я понимаю, как строка и столбец сканирования. Из доски, мы знаем, что:

  • индекс = 9 * строка + столбец
  • строка = пол (индекс/9)
  • цв = индекс% 9

И для блока , потому что он построен из платы 3x3, поэтому формула: block_index = 3*row_block + col_row. Потому что на блок есть 3 строки и столбцы, поэтому формула для row_block = floor(row/3) и col_block = floor(col/3). Отсюда можно сделать вывод, что:

block_index = 3*row_block + col_row 
block_index = 3(floor(row/3)) + floor(col/3) 
block_index = floor(row/3)*3 + floor(col/3) 

Это может объяснить, для этих функций:

  • return_row
  • retun_col
  • return_block
  • is_possible_row
  • is_possible_col

Но я не могу понять о функции is_possible_block. Вот функция:

function is_possible_block($number,$block,$sudoku){ 
    $possible = true; 
    for($x = 0;$x <= 8;$x++){ 
     if($sudoku[floor($block/3) * 27 + $x % 3 + 9 * floor($x/3) + 3 * ($block % 3)] == $number){ 
      $possible = false; 
     } 
    } 
    return $possible; 
} 

Что я знаю о is_possible_block функции является:

floor($block/3) * 27 + $x % 3 + 9 * floor($x/3) + 3 * ($block % 3) 

= 9row+col 
= 9(floor($block/3)*3 + floor($x/3)) + ($x%3 + 3*($block%3)) 

row = 3row_block+row_x_block 
floor($block/3) = row_block 
    floor($x/3) = row_x_block 

col = 3col_block+col_x_block 

Как col = 3col_block+col_x_block, потому что я знаю, формула должна быть такой: col = 3row_block+col.

Я знаю col_x_block Средняя позиция столбца на 0-8 блоках. И row_block среднее положение строки на блоке 0-2.

Как вы объясните эту формулу? Спасибо

UPDATE

Теперь я знаю. floor($block/3)*3 и 3*($block%3) определяют верхний левый угол в блоке. Затем floor($x/3) и $x % 3 перемещают каждую ячейку в блоке.

+0

Объясните алгоритм? – Raptor

+0

Объясните формулу. Как мы получим эту формулу?Я запутался в том, как рассуждать в формуле is_possible_block – john

ответ

0

Я использую его в C++

for(int k = ((x - 1)/3) * 3 + 1; k < ((x - 1)/3) * 3 + 4; k++ 

из "х" является целым числом "/" операция возврата INT значение.

возможно 3 (этаж ($ block-1/3)) может вам помочь.

+0

вы можете подробнее рассказать о своем ответе? Это основанная на 0 или основанная на суде судоку? И как мы получаем номер 4 здесь? – john

+0

Определенный массив [10] [10] и подтвердите от 1 до 9. –

+0

, когда x = 4,5,6 дюйма ((x - 1)/3) * 3 + 1 return ((x - 1)/3) return 1, и ((x - 1)/3) * 3 + 1 return 4 –

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