mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
Add '-v' option to patternsolver, to make it show its working.
[originally from svn r8914]
This commit is contained in:
89
pattern.c
89
pattern.c
@ -339,6 +339,10 @@ static int compute_rowdata(int *ret, unsigned char *start, int len, int step)
|
|||||||
#define DOT 2
|
#define DOT 2
|
||||||
#define STILL_UNKNOWN 3
|
#define STILL_UNKNOWN 3
|
||||||
|
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
int verbose = FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
static void do_recurse(unsigned char *known, unsigned char *deduced,
|
static void do_recurse(unsigned char *known, unsigned char *deduced,
|
||||||
unsigned char *row, int *data, int len,
|
unsigned char *row, int *data, int len,
|
||||||
int freespace, int ndone, int lowest)
|
int freespace, int ndone, int lowest)
|
||||||
@ -367,7 +371,11 @@ static void do_recurse(unsigned char *known, unsigned char *deduced,
|
|||||||
|
|
||||||
static int do_row(unsigned char *known, unsigned char *deduced,
|
static int do_row(unsigned char *known, unsigned char *deduced,
|
||||||
unsigned char *row,
|
unsigned char *row,
|
||||||
unsigned char *start, int len, int step, int *data)
|
unsigned char *start, int len, int step, int *data
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
, const char *rowcol, int index, int cluewid
|
||||||
|
#endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
int rowlen, i, freespace, done_any;
|
int rowlen, i, freespace, done_any;
|
||||||
|
|
||||||
@ -387,6 +395,27 @@ static int do_row(unsigned char *known, unsigned char *deduced,
|
|||||||
start[i*step] = deduced[i];
|
start[i*step] = deduced[i];
|
||||||
done_any = TRUE;
|
done_any = TRUE;
|
||||||
}
|
}
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
if (verbose && done_any) {
|
||||||
|
char buf[80];
|
||||||
|
int thiscluewid;
|
||||||
|
printf("%s %2d: [", rowcol, index);
|
||||||
|
for (thiscluewid = -1, i = 0; data[i]; i++)
|
||||||
|
thiscluewid += sprintf(buf, " %d", data[i]);
|
||||||
|
printf("%*s", cluewid - thiscluewid, "");
|
||||||
|
for (i = 0; data[i]; i++)
|
||||||
|
printf(" %d", data[i]);
|
||||||
|
printf(" ] ");
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
putchar(known[i] == BLOCK ? '#' :
|
||||||
|
known[i] == DOT ? '.' : '?');
|
||||||
|
printf(" -> ");
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
putchar(start[i*step] == BLOCK ? '#' :
|
||||||
|
start[i*step] == DOT ? '.' : '?');
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return done_any;
|
return done_any;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,12 +473,20 @@ static unsigned char *generate_soluble(random_state *rs, int w, int h)
|
|||||||
for (i=0; i<h; i++) {
|
for (i=0; i<h; i++) {
|
||||||
rowdata[compute_rowdata(rowdata, grid+i*w, w, 1)] = 0;
|
rowdata[compute_rowdata(rowdata, grid+i*w, w, 1)] = 0;
|
||||||
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
||||||
matrix+i*w, w, 1, rowdata);
|
matrix+i*w, w, 1, rowdata
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
, NULL, 0, 0 /* never do diagnostics here */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
for (i=0; i<w; i++) {
|
for (i=0; i<w; i++) {
|
||||||
rowdata[compute_rowdata(rowdata, grid+i, h, w)] = 0;
|
rowdata[compute_rowdata(rowdata, grid+i, h, w)] = 0;
|
||||||
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
||||||
matrix+i, h, w, rowdata);
|
matrix+i, h, w, rowdata
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
, NULL, 0, 0 /* never do diagnostics here */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} while (done_any);
|
} while (done_any);
|
||||||
|
|
||||||
@ -695,13 +732,21 @@ static char *solve_game(game_state *state, game_state *currstate,
|
|||||||
max*sizeof(int));
|
max*sizeof(int));
|
||||||
rowdata[state->rowlen[w+i]] = 0;
|
rowdata[state->rowlen[w+i]] = 0;
|
||||||
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
||||||
matrix+i*w, w, 1, rowdata);
|
matrix+i*w, w, 1, rowdata
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
, NULL, 0, 0 /* never do diagnostics here */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
for (i=0; i<w; i++) {
|
for (i=0; i<w; i++) {
|
||||||
memcpy(rowdata, state->rowdata + state->rowsize*i, max*sizeof(int));
|
memcpy(rowdata, state->rowdata + state->rowsize*i, max*sizeof(int));
|
||||||
rowdata[state->rowlen[i]] = 0;
|
rowdata[state->rowlen[i]] = 0;
|
||||||
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
||||||
matrix+i, h, w, rowdata);
|
matrix+i, h, w, rowdata
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
, NULL, 0, 0 /* never do diagnostics here */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} while (done_any);
|
} while (done_any);
|
||||||
|
|
||||||
@ -1358,8 +1403,12 @@ int main(int argc, char **argv)
|
|||||||
while (--argc > 0) {
|
while (--argc > 0) {
|
||||||
char *p = *++argv;
|
char *p = *++argv;
|
||||||
if (*p == '-') {
|
if (*p == '-') {
|
||||||
|
if (!strcmp(p, "-v")) {
|
||||||
|
verbose = TRUE;
|
||||||
|
} else {
|
||||||
fprintf(stderr, "%s: unrecognised option `%s'\n", argv[0], p);
|
fprintf(stderr, "%s: unrecognised option `%s'\n", argv[0], p);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
id = p;
|
id = p;
|
||||||
}
|
}
|
||||||
@ -1387,7 +1436,7 @@ int main(int argc, char **argv)
|
|||||||
s = new_game(NULL, p, desc);
|
s = new_game(NULL, p, desc);
|
||||||
|
|
||||||
{
|
{
|
||||||
int w = p->w, h = p->h, i, j, done_any, max;
|
int w = p->w, h = p->h, i, j, done_any, max, cluewid = 0;
|
||||||
unsigned char *matrix, *workspace;
|
unsigned char *matrix, *workspace;
|
||||||
int *rowdata;
|
int *rowdata;
|
||||||
|
|
||||||
@ -1398,6 +1447,22 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
memset(matrix, 0, w*h);
|
memset(matrix, 0, w*h);
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
|
int thiswid;
|
||||||
|
/*
|
||||||
|
* Work out the maximum text width of the clue numbers
|
||||||
|
* in a row or column, so we can print the solver's
|
||||||
|
* working in a nicely lined up way.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < (w+h); i++) {
|
||||||
|
char buf[80];
|
||||||
|
for (thiswid = -1, j = 0; j < s->rowlen[i]; j++)
|
||||||
|
thiswid += sprintf(buf, " %d", s->rowdata[s->rowsize*i+j]);
|
||||||
|
if (cluewid < thiswid)
|
||||||
|
cluewid = thiswid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
done_any = 0;
|
done_any = 0;
|
||||||
for (i=0; i<h; i++) {
|
for (i=0; i<h; i++) {
|
||||||
@ -1405,13 +1470,21 @@ int main(int argc, char **argv)
|
|||||||
max*sizeof(int));
|
max*sizeof(int));
|
||||||
rowdata[s->rowlen[w+i]] = 0;
|
rowdata[s->rowlen[w+i]] = 0;
|
||||||
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
||||||
matrix+i*w, w, 1, rowdata);
|
matrix+i*w, w, 1, rowdata
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
, "row", i+1, cluewid
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
for (i=0; i<w; i++) {
|
for (i=0; i<w; i++) {
|
||||||
memcpy(rowdata, s->rowdata + s->rowsize*i, max*sizeof(int));
|
memcpy(rowdata, s->rowdata + s->rowsize*i, max*sizeof(int));
|
||||||
rowdata[s->rowlen[i]] = 0;
|
rowdata[s->rowlen[i]] = 0;
|
||||||
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
done_any |= do_row(workspace, workspace+max, workspace+2*max,
|
||||||
matrix+i, h, w, rowdata);
|
matrix+i, h, w, rowdata
|
||||||
|
#ifdef STANDALONE_SOLVER
|
||||||
|
, "col", i+1, cluewid
|
||||||
|
#endif
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} while (done_any);
|
} while (done_any);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user