Разделить массив 9x9 2d на 9 подрешеток (как в судоку)?(C ++) - PullRequest
1 голос
/ 18 января 2011

Я пытаюсь закодировать решатель судоку, и я попытался сделать так, чтобы сетка указателей 9x9 содержала адрес «заданных» объектов, который имеет либо решение, либо допустимые возможные значения.

Мне удалось пройти через массив с 2 циклами for, сначала через каждый столбец, а затем перейти к следующему ряду и повторить.

Однако мне трудно представить, как бы я обозначил, к какой подсети (или блоку, блоку и т. Д.) Относится конкретная ячейка.Мое первоначальное впечатление заключалось в том, чтобы иметь операторы if в циклах for, например, если строка <2 (строки начинаются с 0) и col <2, то мы находимся в 1-м блоке, но это, кажется, запутано.Был бы лучший способ сделать это? </p>

Ответы [ 3 ]

7 голосов
/ 18 января 2011

Вы можете вычислить номер блока из строки и столбца следующим образом:

int block = (row/3)*3 + (col/3);

Это число блоков, как это:

+---+---+---+
| 0 | 1 | 2 |
+---+---+---+
| 3 | 4 | 5 |
+---+---+---+
| 6 | 7 | 8 |
+---+---+---+
0 голосов
/ 18 января 2011

Я использую это сам (но затем в python, предполагая, что x и y переходят от 0 до 9 исключений):

int bx, by;
for (bx = (x/3)*3; bx < (x/3)*3 + 3; bx++) {
    for (by = (y/3)*3; by < (y/3)*3 + 3; by++) {
        // bx and by will now loop over each number in the block which also contains x, y
    }
}
0 голосов
/ 18 января 2011

Я бы создал таблицу поиска с 81 записью.Каждая запись относится к ячейке в сетке 9x9 и дает вам необходимую информацию (какой блок, какой столбец, какой ряд, ...)

...