Я пробовал это решение 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
перемещают каждую ячейку в блоке.
Объясните алгоритм? – Raptor
Объясните формулу. Как мы получим эту формулу?Я запутался в том, как рассуждать в формуле is_possible_block – john