shithub: puzzles

Download patch

ref: 6ea453c95f1051b23bc128a34e1166bc9c53cdff
parent: f9168d6003042b3dfa175175f54b512c5886ac18
author: Simon Tatham <anakin@pobox.com>
date: Mon Oct 17 14:41:05 EDT 2005

Miscellaneous fixes. Correct a comparison of y with w causing
assertion failures in portrait-type grids; retire an unused array in
the game generation function (my original generation strategy needed
it, but the final one didn't); correct a typo; further restrict the
generable sizes of game and include a special case for 4x4dt to
prevent a tight loop.

[originally from svn r6405]

--- a/tents.c
+++ b/tents.c
@@ -415,8 +415,12 @@
 
 static char *validate_params(game_params *params, int full)
 {
-    if (params->w < 2 || params->h < 2)
-	return "Width and height must both be at least two";
+    /*
+     * Generating anything under 4x4 runs into trouble of one kind
+     * or another.
+     */
+    if (params->w < 4 || params->h < 4)
+	return "Width and height must both be at least four";
     return NULL;
 }
 
@@ -916,7 +920,7 @@
     char *puzzle = snewn(w*h, char);
     int *numbers = snewn(w+h, int);
     char *soln = snewn(w*h, char);
-    int *temp = snewn(2*w*h, int), *itemp = temp + w*h;
+    int *temp = snewn(2*w*h, int);
     int maxedges = ntrees*4 + w*h;
     int *edges = snewn(2*maxedges, int);
     int *capacity = snewn(maxedges, int);
@@ -962,9 +966,9 @@
      * The maxflow algorithm is not randomised, so employed naively
      * it would give rise to grids with clear structure and
      * directional bias. Hence, I assign the network nodes as seen
-     * by maxflow to be a _random_ permutation the squares of the
-     * grid, so that any bias shown by maxflow towards low-numbered
-     * nodes is turned into a random bias.
+     * by maxflow to be a _random_ permutation of the squares of
+     * the grid, so that any bias shown by maxflow towards
+     * low-numbered nodes is turned into a random bias.
      * 
      * This generation strategy can fail at many points, including
      * as early as tent placement (if you get a bad random order in
@@ -979,16 +983,16 @@
      * trouble.
      */
 
+    if (params->diff > DIFF_EASY && params->w <= 4 && params->h <= 4)
+	params->diff = DIFF_EASY;      /* downgrade to prevent tight loop */
+
     while (1) {
 	/*
-	 * Arrange the grid squares into a random order, and invert
-	 * that order so we can find a square's index as well.
+	 * Arrange the grid squares into a random order.
 	 */
 	for (i = 0; i < w*h; i++)
 	    temp[i] = i;
 	shuffle(temp, w*h, sizeof(*temp), rs);
-	for (i = 0; i < w*h; i++)
-	    itemp[temp[i]] = i;
 
 	/*
 	 * The first `ntrees' entries in temp which we can get
@@ -1562,7 +1566,7 @@
         ymin = min(ui->dsy, ui->dey);
         ymax = max(ui->dsy, ui->dey);
         assert(0 <= xmin && xmin <= xmax && xmax < w);
-        assert(0 <= ymin && ymin <= ymax && ymax < w);
+        assert(0 <= ymin && ymin <= ymax && ymax < h);
 
         buflen = 0;
         bufsize = 256;