mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
Stop failing assertions when we encounter an insoluble puzzle.
[originally from svn r7408]
This commit is contained in:
37
rect.c
37
rect.c
@ -329,6 +329,11 @@ static void remove_number_placement(int w, int h, struct numberdata *number,
|
|||||||
number->npoints--;
|
number->npoints--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns 0 for failure to solve due to inconsistency; 1 for
|
||||||
|
* success; 2 for failure to complete a solution due to either
|
||||||
|
* ambiguity or it being too difficult.
|
||||||
|
*/
|
||||||
static int rect_solver(int w, int h, int nrects, struct numberdata *numbers,
|
static int rect_solver(int w, int h, int nrects, struct numberdata *numbers,
|
||||||
unsigned char *hedge, unsigned char *vedge,
|
unsigned char *hedge, unsigned char *vedge,
|
||||||
random_state *rs)
|
random_state *rs)
|
||||||
@ -434,6 +439,14 @@ static int rect_solver(int w, int h, int nrects, struct numberdata *numbers,
|
|||||||
* Indexing of this array is by the formula
|
* Indexing of this array is by the formula
|
||||||
*
|
*
|
||||||
* overlaps[(rectindex * h + y) * w + x]
|
* overlaps[(rectindex * h + y) * w + x]
|
||||||
|
*
|
||||||
|
* A positive or zero value indicates what it sounds as if it
|
||||||
|
* should; -1 indicates that this square _cannot_ be part of
|
||||||
|
* this rectangle; and -2 indicates that it _definitely_ is
|
||||||
|
* (which is distinct from 1, because one might very well know
|
||||||
|
* that _if_ square S is part of rectangle R then it must be
|
||||||
|
* because R is placed in a certain position without knowing
|
||||||
|
* that it definitely _is_).
|
||||||
*/
|
*/
|
||||||
overlaps = snewn(nrects * w * h, int);
|
overlaps = snewn(nrects * w * h, int);
|
||||||
memset(overlaps, 0, nrects * w * h * sizeof(int));
|
memset(overlaps, 0, nrects * w * h * sizeof(int));
|
||||||
@ -526,7 +539,10 @@ static int rect_solver(int w, int h, int nrects, struct numberdata *numbers,
|
|||||||
if (overlaps[(i * h + y) * w + x] >= -1) {
|
if (overlaps[(i * h + y) * w + x] >= -1) {
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
assert(overlaps[(i * h + y) * w + x] > 0);
|
if (overlaps[(i * h + y) * w + x] <= 0) {
|
||||||
|
ret = 0; /* inconsistency */
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
#ifdef SOLVER_DIAGNOSTICS
|
#ifdef SOLVER_DIAGNOSTICS
|
||||||
printf("marking %d,%d as known for rect %d"
|
printf("marking %d,%d as known for rect %d"
|
||||||
" (sole remaining number position)\n", x, y, i);
|
" (sole remaining number position)\n", x, y, i);
|
||||||
@ -568,7 +584,10 @@ static int rect_solver(int w, int h, int nrects, struct numberdata *numbers,
|
|||||||
for (yy = miny; yy < maxy; yy++)
|
for (yy = miny; yy < maxy; yy++)
|
||||||
for (xx = minx; xx < maxx; xx++)
|
for (xx = minx; xx < maxx; xx++)
|
||||||
if (overlaps[(i * h + yy) * w + xx] >= -1) {
|
if (overlaps[(i * h + yy) * w + xx] >= -1) {
|
||||||
assert(overlaps[(i * h + yy) * w + xx] > 0);
|
if (overlaps[(i * h + yy) * w + xx] <= 0) {
|
||||||
|
ret = 0; /* inconsistency */
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
#ifdef SOLVER_DIAGNOSTICS
|
#ifdef SOLVER_DIAGNOSTICS
|
||||||
printf("marking %d,%d as known for rect %d"
|
printf("marking %d,%d as known for rect %d"
|
||||||
" (intersection of all placements)\n",
|
" (intersection of all placements)\n",
|
||||||
@ -847,15 +866,17 @@ static int rect_solver(int w, int h, int nrects, struct numberdata *numbers,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
cleanup:
|
||||||
|
ret = 1;
|
||||||
for (i = 0; i < nrects; i++) {
|
for (i = 0; i < nrects; i++) {
|
||||||
#ifdef SOLVER_DIAGNOSTICS
|
#ifdef SOLVER_DIAGNOSTICS
|
||||||
printf("rect %d has %d possible placements\n",
|
printf("rect %d has %d possible placements\n",
|
||||||
i, rectpositions[i].n);
|
i, rectpositions[i].n);
|
||||||
#endif
|
#endif
|
||||||
assert(rectpositions[i].n > 0);
|
if (rectpositions[i].n <= 0) {
|
||||||
if (rectpositions[i].n > 1) {
|
ret = 0; /* inconsistency */
|
||||||
ret = FALSE;
|
} else if (rectpositions[i].n > 1) {
|
||||||
|
ret = 2; /* remaining uncertainty */
|
||||||
} else if (hedge && vedge) {
|
} else if (hedge && vedge) {
|
||||||
/*
|
/*
|
||||||
* Place the rectangle in its only possible position.
|
* Place the rectangle in its only possible position.
|
||||||
@ -1639,9 +1660,9 @@ static char *new_game_desc(game_params *params, random_state *rs,
|
|||||||
ret = rect_solver(params->w, params->h, nnumbers, nd,
|
ret = rect_solver(params->w, params->h, nnumbers, nd,
|
||||||
NULL, NULL, rs);
|
NULL, NULL, rs);
|
||||||
else
|
else
|
||||||
ret = TRUE; /* allow any number placement at all */
|
ret = 1; /* allow any number placement at all */
|
||||||
|
|
||||||
if (ret) {
|
if (ret == 1) {
|
||||||
/*
|
/*
|
||||||
* Now place the numbers according to the solver's
|
* Now place the numbers according to the solver's
|
||||||
* recommendations.
|
* recommendations.
|
||||||
|
Reference in New Issue
Block a user