Я попробовал этот решатель судоку http://www.emanueleferonato.com/2008/12/09/sudoku-creatorsolver-with-php/. Работает нормально.
Также см. Эту таблицу, чтобы увидеть более подробную информацию в расчете: таблица
Я понимаю, как строки и col сканирования. Из доски мы знаем, что:
А для блока, потому что он построен из 3х3 платы, поэтому формула: 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)
Это можно объяснить для этих функций:
Но я не могу понять о 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.
Как вы объясните эту формулу? Спасибо
ОБНОВИТЬ
Теперь я знаю. floor($block/3)*3
а также 3*($block%3)
определить верхний левый угол в блоке. затем floor($x / 3)
а также $x % 3
перемещает каждую ячейку в блоке.
Я использую это в C ++
for(int k = ((x - 1) / 3) * 3 + 1; k < ((x - 1) / 3) * 3 + 4; k++
из-за «x» является целым числом «/» операция возвращает значение int.
возможно 3 (этаж ($ block-1/3)) может помочь вам.
Других решений пока нет …