Судоку, алгоритм возврата

Метод возврата судоку

int xx = (pos.getX() / 3) * 3;          
int yy = (pos.getY() / 3) * 3;           
for (int y = 0; y < 3; y++) {              
    for (int x = 0; x < 3; x++) {               
        if ((xx + x != pos.getX()) && (yy + y != pos.getY())) {            
            possible[work[xx + x][yy + y]] = false;           

где х и у =

private byte x;
private byte y;

Может кто-нибудь объяснить, почему мы делим на три и умножаем на три?

(pos.getY() / 3) * 3;                      
(pos.getX() / 3) * 3;

person user1409863    schedule 22.05.2012    source источник


Ответы (2)


Деление является целочисленным делением, поэтому оно удалит остаток. Выполнение целочисленного деления с последующим умножением даст вам индекс первой ячейки правильного блока 3x3.

E.g.

pos    0    1    2    3    4    5    6    7    8
/3     0    0    0    1    1    1    2    2    2
*3     0    0    0    3    3    3    6    6    6
person brain    schedule 22.05.2012

Потому что нам нужно кратное 3. Нам нужно наибольшее кратное 3, которое меньше, чем pos.getX(). Он соответствует верхней левой ячейке в текущем квадрате 3x3.

Помните, что X/3 должно быть целым числом, поэтому (X/3)*3 может не равняться X.

person Thomash    schedule 22.05.2012