return h;
}
-board_t *initplay (board_t *board)
+board_t *_lookforforbidenposition (board_t *board, board_t *box, int i, char val)
{
+ int j;
int n = sqrti (board->length);
- /* k is value */
+ for (j = 0; j < board->length; j++) {
+
+ /* box check */
+ if (getvalue (board, n * (i % n) + j % n, n * (i / n) + j / n) != ' ') {
+ *getcell (box, j % n, j / n) = '#';
+ }
+
+ /* verical check */
+ if ((j / n == i / n) && (j % n != i % n)) {
+ int l;
+ for (l = 0; l < board->length; l++) {
+ if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
+ int t;
+ for (t = 0; t < n; t++) {
+ *getcell (box, t, l / n) = '#';
+ }
+ }
+ }
+ }
+
+ /* horizontal check */
+ if ((j / n != i / n) && (j % n == i % n)) {
+ int l;
+ for (l = 0; l < board->length; l++) {
+ if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
+ int t;
+ for (t = 0; t < n; t++) {
+ *getcell (box, l % n, t) = '#';
+ }
+ }
+ }
+ }
+
+ }
+
+ return box;
+}
+
+board_t *initplay (board_t *board, int nb_known_tiles)
+{
int k;
+ int n = sqrti (board->length);
+
+ /* init boxes */
+ board_t **vboxes = (board_t **) calloc (sizeof (board_t *), board->length);
+ CHECKALLOC (vboxes);
for (k = 0; k < board->length; k++) {
+ vboxes[k] = initboard (n);
+ }
+
+ /* k is value */
+ for (k = 0; k < nb_known_tiles; k++) {
char val = _itoh (1 + k);
- board_t *vbox = initboard (n);
+ board_t *vbox = vboxes[k];
/* i in position */
int i;
int j;
/* look for forbiden position */
- board_t *box = copyboard (vbox);
-
- for (j = 0; j < board->length; j++) {
-
- /* box check */
- if (getvalue (board, n * (i % n) + j % n, n * (i / n) + j / n) != ' ') {
- *getcell (box, j % n, j / n) = '#';
- }
-
- /* verical check */
- if ((j / n == i / n) && (j % n != i % n)) {
- int l;
- for (l = 0; l < board->length; l++) {
- if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
- int t;
- for (t = 0; t < n; t++) {
- *getcell (box, t, l / n) = '#';
- }
- }
- }
- }
-
- /* horizontal check */
- if ((j / n != i / n) && (j % n == i % n)) {
- int l;
- for (l = 0; l < board->length; l++) {
- if (getvalue (board, n * (j % n) + l % n, n * (j / n) + l / n) == val) {
- int t;
- for (t = 0; t < n; t++) {
- *getcell (box, l % n, t) = '#';
- }
- }
- }
- }
-
- }
+ board_t *box = _lookforforbidenposition (board, copyboard (vbox), i, val);
/* count avaliable position */
int pos = 0;
freeboard (box);
}
- freeboard (vbox);
}
+ for (k = 0; k < board->length; k++) {
+ freeboard (vboxes[k]);
+ }
+ free (vboxes);
+
return board;
}