From b995b981193ec9ab02d22ca3851474458525981e Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 6 Mar 2025 08:01:36 +0100 Subject: [PATCH] variable known tiles --- function.c | 111 +++++++++++++++++++++++++++++++++-------------------- sudoku.c | 14 ++++++- 2 files changed, 82 insertions(+), 43 deletions(-) diff --git a/function.c b/function.c index 54583fd..42701b6 100644 --- a/function.c +++ b/function.c @@ -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; } diff --git a/sudoku.c b/sudoku.c index 3b14783..074d5dc 100644 --- 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 (); -- 2.30.2