shithub: puzzles

Download patch

ref: bda4a963f447e3395a160e57ab9498278ad2fde2
parent: d442b830e492535c9b0f1cb6b6c1d91ef2304bd2
author: Jonas Kölker <jonaskoelker@yahoo.com>
date: Thu Oct 1 17:22:24 EDT 2015

Fix an instance generation hang in Signpost.

Also expand the set of permissible parameters (add 1xN, Nx1 and 2x2).

--- a/signpost.c
+++ b/signpost.c
@@ -422,11 +422,12 @@
 
 static char *validate_params(const game_params *params, int full)
 {
-    if (params->w < 2 || params->h < 2)
-	return "Width and height must both be at least two";
-    if (params->w == 2 && params->h == 2)   /* leads to generation hang */
-	return "Width and height cannot both be two";
-
+    if (params->w < 1) return "Width must be at least one";
+    if (params->h < 1) return "Height must be at least one";
+    if (full && params->w == 1 && params->h == 1)
+	/* The UI doesn't let us move these from unsolved to solved,
+	 * so we disallow generating (but not playing) them. */
+	return "Width and height cannot both be one";
     return NULL;
 }
 
@@ -623,6 +624,7 @@
 
     state->dirs[taili] = 0;
     nfilled = 2;
+    assert(state->n > 1);
 
     while (nfilled < state->n) {
         /* Try and expand _from_ headi; keep going if there's only one
@@ -638,6 +640,8 @@
             an = cell_adj(state, headi, aidx, adir);
         } while (an == 1);
 
+	if (nfilled == state->n) break;
+
         /* Try and expand _to_ taili; keep going if there's only one
          * place to go to. */
         an = cell_adj(state, taili, aidx, adir);
@@ -800,6 +804,9 @@
     game_state *state = blank_game(params->w, params->h);
     char *ret;
     int headi, taili;
+
+    /* this shouldn't happen (validate_params), but let's play it safe */
+    if (params->w == 1 && params->h == 1) return dupstr("1a");
 
 generate:
     blank_game_into(state);