shithub: puzzles

Download patch

ref: fc3f16b364e64ad01c3c1d19e99051b922e2a4f8
parent: d45d94d355916117cd4c66b050b3ec14c4fbbd4a
author: Simon Tatham <anakin@pobox.com>
date: Sun May 22 07:15:03 EDT 2005

The Net solver now makes use of barrier information when applied to
a typed-in grid.

[originally from svn r5827]

--- a/net.c
+++ b/net.c
@@ -415,7 +415,8 @@
     return ret;
 }
 
-static int net_solver(int w, int h, unsigned char *tiles, int wrapping)
+static int net_solver(int w, int h, unsigned char *tiles,
+		      unsigned char *barriers, int wrapping)
 {
     unsigned char *tilestate;
     unsigned char *edgestate;
@@ -523,6 +524,30 @@
     }
 
     /*
+     * If we have barriers available, we can mark those edges as
+     * closed too.
+     */
+    if (barriers) {
+	for (y = 0; y < h; y++) for (x = 0; x < w; x++) {
+	    int d;
+	    for (d = 1; d <= 8; d += d) {
+		if (barriers[y*w+x] & d) {
+		    int x2, y2;
+		    /*
+		     * In principle the barrier list should already
+		     * contain each barrier from each side, but
+		     * let's not take chances with our internal
+		     * consistency.
+		     */
+		    OFFSETWH(x2, y2, x, y, d, w, h);
+		    edgestate[(y*w+x) * 5 + d] = 2;
+		    edgestate[(y2*w+x2) * 5 + F(d)] = 2;
+		}
+	    }
+	}
+    }
+
+    /*
      * Since most deductions made by this solver are local (the
      * exception is loop avoidance, where joining two tiles
      * together on one side of the grid can theoretically permit a
@@ -1264,7 +1289,7 @@
 	/*
 	 * Run the solver to check unique solubility.
 	 */
-	while (!net_solver(w, h, tiles, params->wrapping)) {
+	while (!net_solver(w, h, tiles, NULL, params->wrapping)) {
 	    int n = 0;
 
 	    /*
@@ -1641,7 +1666,8 @@
 	 * not yield a complete solution.
 	 */
 	ret = dup_game(state);
-	net_solver(ret->width, ret->height, ret->tiles, ret->wrapping);
+	net_solver(ret->width, ret->height, ret->tiles,
+		   ret->barriers, ret->wrapping);
     } else {
 	assert(aux->width == state->width);
 	assert(aux->height == state->height);