Блок сканирования по объяснению судоку

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

Также см. Эту таблицу, чтобы увидеть более подробную информацию в расчете: таблица

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

  • index = 9 * row + col
  • ряд = этаж (индекс / 9)
  • col = index% 9

А для блока, потому что он построен из 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)

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

  • 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.

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

ОБНОВИТЬ

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

0

Решение

Я использую это в C ++

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

из-за «x» является целым числом «/» операция возвращает значение int.

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]