2012-05-22 3 views
2

Судоку методсудоку, отступиться алгоритм

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; 

ответ

1

Дивизия целочисленное деление поэтому он будет удалить остаток. Выполнение целочисленного деления, следующего за умножением, даст вам первый индекс ячейки правильного блока 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 
1

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

Запомнить Х/3 должно быть целым числом, так (Х/3) * 3 не может быть равна X.

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