variable known tiles
authorLaurent Mazet <mazet@softndesign.org>
Thu, 6 Mar 2025 07:01:36 +0000 (08:01 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 6 Mar 2025 07:01:36 +0000 (08:01 +0100)
function.c
sudoku.c

index 54583fd286c5eea3e72a891aec3cdb1a6f3d8b6b..42701b674ac63fcc5d080f0a2e713fbf4d4da747 100644 (file)
@@ -71,7 +71,40 @@ char _itoh (int x)
     return h;
 }
 
-board_t *_lookforforbidenposition (board_t *board, board_t *box, int i, char val)
+board_t *_idemposition (board_t *board, char val)
+{
+    int n = sqrti (board->length);
+
+    board_t *box = initboard (n);
+
+    int i, j;
+    for (i = 0; i < board->length; i++) {
+        for (j = 0; j < board->length; j++) {
+            if (getvalue (board, i, j) == val) {
+                *getcell (box, i % n, j % n) = '#';
+            }
+        }
+    }
+    return box;
+}
+
+int _isinbox (board_t *board, int i, int j, char val)
+{
+    int n = sqrti (board->length);
+
+    int k, l;
+    for (k = 0; k < n; k++) {
+        for (l = 0; l < n; l++) {
+            if (getvalue (board, n * i + k, n * j + l) == val) {
+                return 1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+board_t *_forbidenposition (board_t *board, board_t *box, int i, char val)
 {
     int j;
     int n = sqrti (board->length);
@@ -116,67 +149,63 @@ board_t *_lookforforbidenposition (board_t *board, board_t *box, int i, char val
 
 board_t *initplay (board_t *board, int nb_known_tiles)
 {
-    int k;
+    int t;
     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);
-    }
+char *buffer = (char *) calloc (board->length * (8 + board->length) + 1, 1);
 
-    /* k is value */
-    for (k = 0; k < nb_known_tiles; k++) {
+    for (t = 0; t < nb_known_tiles; t++) {
+
+        /* k is value */
+        int k = rand () % board->length;
         char val = _itoh (1 + k);
-        board_t *vbox = vboxes[k];
+        board_t *box = _idemposition (board, val);
+
+_makecomments (buffer, box);
+printf ("box:\n%s", buffer);
 
         /* i in position */
         int i;
-        for (i = 0; i < board->length; i++) {
-            int j;
-
-            /* look for forbiden position */
-            board_t *box = _lookforforbidenposition (board, copyboard (vbox), i, val);
-
-            /* count avaliable position */
-            int pos = 0;
-            for (j = 0; j < board->length; j++) {
-                if (getvalue (box, j % n, j / n) == ' ') {
-                    pos++;
-                }
+        do {
+            i = rand () % board->length;
+        } while (_isinbox (board, i % n, i / n, val));
+
+        /* look for forbiden position */
+        _forbidenposition (board, box, i, val);
+
+_makecomments (buffer, box);
+printf ("box:\n%s", buffer);
+
+        /* count avaliable position */
+        int j;
+        int pos = 0;
+        for (j = 0; j < board->length; j++) {
+            if (getvalue (box, j % n, j / n) == ' ') {
+                pos++;
             }
+        }
+
+        /* random position */
+        if (pos > 0) {
+            pos = rand () % pos;
 
-            /* random position */
-            if (pos > 0) {
-                pos = rand () % pos;
-            }
             for (j = 0; (j < board->length) && (pos >= 0); j++) {
                 if (getvalue (box, j % n, j / n) == ' ') {
                     if (pos == 0) {
                         *getcell (board, n * (i % n) + j % n, n * (i / n) + j / n) = val;
-                        *getcell (vbox, j % n, j / n) = '#';
                     }
                     pos--;
                 }
             }
-
-            char *buffer = (char *) calloc (board->length * (8 + board->length) + 1, 1);
-            _makecomments (buffer, box);
-            printf ("box:\n%s", buffer);
-            _makecomments (buffer, board);
-            printf ("board:\n%s", buffer);
-            free (buffer);
-
-            freeboard (box);
         }
 
-    }
+        _makecomments (buffer, board);
+        printf ("board:\n%s", buffer);
 
-    for (k = 0; k < board->length; k++) {
-        freeboard (vboxes[k]);
+        freeboard (box);
     }
-    free (vboxes);
+
+free (buffer);
 
     return board;
 }
index 3b14783567f34f0d29fd1cec81e8e6c06160b316..074d5dc987711533588ac7e3de82cb5b39424e2c 100644 (file)
--- a/sudoku.c
+++ b/sudoku.c
@@ -21,6 +21,7 @@ char *progname = NULL;
 char *version = "0.1";
 
 int length = 3;
+int nb = 20;
 int seed = 0;
 int xoffset = 1;
 int yoffset = 1;
@@ -36,9 +37,10 @@ char *help =
 int usage (int ret)
 {
     FILE *fd = ret ? stderr : stdout;
-    fprintf (fd, "usage: %s [-h] [-l length] [-s seed] [-v level]\n", progname);
+    fprintf (fd, "usage: %s [-h] [-l length] [-n nb] [-s seed] [-v level]\n", progname);
     fprintf (fd, " -h: help message\n");
     fprintf (fd, " -l: box length (%d)\n", length);
+    fprintf (fd, " -n: nb known tiles (%d)\n", nb);
     fprintf (fd, " -s: random seed (%d)\n", seed);
     fprintf (fd, " -v: verbose level (%d)\n", verbose);
     fprintf (fd, "%s version %s\n", progname, version);
@@ -76,6 +78,14 @@ int main (int argc, char *argv[])
             }
             length = atoi (arg);
             break;
+        case 'n':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: no nb of known tiles specified\n", progname));
+                return usage (1);
+            }
+            nb = atoi (arg);
+            break;
         case 's':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg == NULL) {
@@ -101,7 +111,7 @@ int main (int argc, char *argv[])
     /* init board */
     srand (seed);
     board_t *board = initboard (length * length);
-    initplay (board, length * length);
+    initplay (board, nb);
 
     /* init curses */
     initscr ();