Move most of face_text_pos() into grid.c, leaving in loopy.c only the
[sgt/puzzles] / tents.c
1 /*
2 * tents.c: Puzzle involving placing tents next to trees subject to
3 * some confusing conditions.
4 *
5 * TODO:
6 *
7 * - it might be nice to make setter-provided tent/nontent clues
8 * inviolable?
9 * * on the other hand, this would introduce considerable extra
10 * complexity and size into the game state; also inviolable
11 * clues would have to be marked as such somehow, in an
12 * intrusive and annoying manner. Since they're never
13 * generated by _my_ generator, I'm currently more inclined
14 * not to bother.
15 *
16 * - more difficult levels at the top end?
17 * * for example, sometimes we can deduce that two BLANKs in
18 * the same row are each adjacent to the same unattached tree
19 * and to nothing else, implying that they can't both be
20 * tents; this enables us to rule out some extra combinations
21 * in the row-based deduction loop, and hence deduce more
22 * from the number in that row than we could otherwise do.
23 * * that by itself doesn't seem worth implementing a new
24 * difficulty level for, but if I can find a few more things
25 * like that then it might become worthwhile.
26 * * I wonder if there's a sensible heuristic for where to
27 * guess which would make a recursive solver viable?
28 */
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <assert.h>
34 #include <ctype.h>
35 #include <math.h>
36
37 #include "puzzles.h"
38 #include "maxflow.h"
39
40 /*
41 * Design discussion
42 * -----------------
43 *
44 * The rules of this puzzle as available on the WWW are poorly
45 * specified. The bits about tents having to be orthogonally
46 * adjacent to trees, tents not being even diagonally adjacent to
47 * one another, and the number of tents in each row and column
48 * being given are simple enough; the difficult bit is the
49 * tent-to-tree matching.
50 *
51 * Some sources use simplistic wordings such as `each tree is
52 * exactly connected to only one tent', which is extremely unclear:
53 * it's easy to read erroneously as `each tree is _orthogonally
54 * adjacent_ to exactly one tent', which is definitely incorrect.
55 * Even the most coherent sources I've found don't do a much better
56 * job of stating the rule.
57 *
58 * A more precise statement of the rule is that it must be possible
59 * to find a bijection f between tents and trees such that each
60 * tree T is orthogonally adjacent to the tent f(T), but that a
61 * tent is permitted to be adjacent to other trees in addition to
62 * its own. This slightly non-obvious criterion is what gives this
63 * puzzle most of its subtlety.
64 *
65 * However, there's a particularly subtle ambiguity left over. Is
66 * the bijection between tents and trees required to be _unique_?
67 * In other words, is that bijection conceptually something the
68 * player should be able to exhibit as part of the solution (even
69 * if they aren't actually required to do so)? Or is it sufficient
70 * to have a unique _placement_ of the tents which gives rise to at
71 * least one suitable bijection?
72 *
73 * The puzzle shown to the right of this .T. 2 *T* 2
74 * paragraph illustrates the problem. There T.T 0 -> T-T 0
75 * are two distinct bijections available. .T. 2 *T* 2
76 * The answer to the above question will
77 * determine whether it's a valid puzzle. 202 202
78 *
79 * This is an important question, because it affects both the
80 * player and the generator. Eventually I found all the instances
81 * of this puzzle I could Google up, solved them all by hand, and
82 * verified that in all cases the tree/tent matching was uniquely
83 * determined given the tree and tent positions. Therefore, the
84 * puzzle as implemented in this source file takes the following
85 * policy:
86 *
87 * - When checking a user-supplied solution for correctness, only
88 * verify that there exists _at least_ one matching.
89 * - When generating a puzzle, enforce that there must be
90 * _exactly_ one.
91 *
92 * Algorithmic implications
93 * ------------------------
94 *
95 * Another way of phrasing the tree/tent matching criterion is to
96 * say that the bipartite adjacency graph between trees and tents
97 * has a perfect matching. That is, if you construct a graph which
98 * has a vertex per tree and a vertex per tent, and an edge between
99 * any tree and tent which are orthogonally adjacent, it is
100 * possible to find a set of N edges of that graph (where N is the
101 * number of trees and also the number of tents) which between them
102 * connect every tree to every tent.
103 *
104 * The most efficient known algorithms for finding such a matching
105 * given a graph, as far as I'm aware, are the Munkres assignment
106 * algorithm (also known as the Hungarian algorithm) and the
107 * Ford-Fulkerson algorithm (for finding optimal flows in
108 * networks). Each of these takes O(N^3) running time; so we're
109 * talking O(N^3) time to verify any candidate solution to this
110 * puzzle. That's just about OK if you're doing it once per mouse
111 * click (and in fact not even that, since the sensible thing to do
112 * is check all the _other_ puzzle criteria and only wade into this
113 * quagmire if none are violated); but if the solver had to keep
114 * doing N^3 work internally, then it would probably end up with
115 * more like N^5 or N^6 running time, and grid generation would
116 * become very clunky.
117 *
118 * Fortunately, I've been able to prove a very useful property of
119 * _unique_ perfect matchings, by adapting the proof of Hall's
120 * Marriage Theorem. For those unaware of Hall's Theorem, I'll
121 * recap it and its proof: it states that a bipartite graph
122 * contains a perfect matching iff every set of vertices on the
123 * left side of the graph have a neighbourhood _at least_ as big on
124 * the right.
125 *
126 * This condition is obviously satisfied if a perfect matching does
127 * exist; each left-side node has a distinct right-side node which
128 * is the one assigned to it by the matching, and thus any set of n
129 * left vertices must have a combined neighbourhood containing at
130 * least the n corresponding right vertices, and possibly others
131 * too. Alternatively, imagine if you had (say) three left-side
132 * nodes all of which were connected to only two right-side nodes
133 * between them: any perfect matching would have to assign one of
134 * those two right nodes to each of the three left nodes, and still
135 * give the three left nodes a different right node each. This is
136 * of course impossible.
137 *
138 * To prove the converse (that if every subset of left vertices
139 * satisfies the Hall condition then a perfect matching exists),
140 * consider trying to find a proper subset of the left vertices
141 * which _exactly_ satisfies the Hall condition: that is, its right
142 * neighbourhood is precisely the same size as it. If we can find
143 * such a subset, then we can split the bipartite graph into two
144 * smaller ones: one consisting of the left subset and its right
145 * neighbourhood, the other consisting of everything else. Edges
146 * from the left side of the former graph to the right side of the
147 * latter do not exist, by construction; edges from the right side
148 * of the former to the left of the latter cannot be part of any
149 * perfect matching because otherwise the left subset would not be
150 * left with enough distinct right vertices to connect to (this is
151 * exactly the same deduction used in Solo's set analysis). You can
152 * then prove (left as an exercise) that both these smaller graphs
153 * still satisfy the Hall condition, and therefore the proof will
154 * follow by induction.
155 *
156 * There's one other possibility, which is the case where _no_
157 * proper subset of the left vertices has a right neighbourhood of
158 * exactly the same size. That is, every left subset has a strictly
159 * _larger_ right neighbourhood. In this situation, we can simply
160 * remove an _arbitrary_ edge from the graph. This cannot reduce
161 * the size of any left subset's right neighbourhood by more than
162 * one, so if all neighbourhoods were strictly bigger than they
163 * needed to be initially, they must now still be _at least as big_
164 * as they need to be. So we can keep throwing out arbitrary edges
165 * until we find a set which exactly satisfies the Hall condition,
166 * and then proceed as above. []
167 *
168 * That's Hall's theorem. I now build on this by examining the
169 * circumstances in which a bipartite graph can have a _unique_
170 * perfect matching. It is clear that in the second case, where no
171 * left subset exactly satisfies the Hall condition and so we can
172 * remove an arbitrary edge, there cannot be a unique perfect
173 * matching: given one perfect matching, we choose our arbitrary
174 * removed edge to be one of those contained in it, and then we can
175 * still find a perfect matching in the remaining graph, which will
176 * be a distinct perfect matching in the original.
177 *
178 * So it is a necessary condition for a unique perfect matching
179 * that there must be at least one proper left subset which
180 * _exactly_ satisfies the Hall condition. But now consider the
181 * smaller graph constructed by taking that left subset and its
182 * neighbourhood: if the graph as a whole had a unique perfect
183 * matching, then so must this smaller one, which means we can find
184 * a proper left subset _again_, and so on. Repeating this process
185 * must eventually reduce us to a graph with only one left-side
186 * vertex (so there are no proper subsets at all); this vertex must
187 * be connected to only one right-side vertex, and hence must be so
188 * in the original graph as well (by construction). So we can
189 * discard this vertex pair from the graph, and any other edges
190 * that involved it (which will by construction be from other left
191 * vertices only), and the resulting smaller graph still has a
192 * unique perfect matching which means we can do the same thing
193 * again.
194 *
195 * In other words, given any bipartite graph with a unique perfect
196 * matching, we can find that matching by the following extremely
197 * simple algorithm:
198 *
199 * - Find a left-side vertex which is only connected to one
200 * right-side vertex.
201 * - Assign those vertices to one another, and therefore discard
202 * any other edges connecting to that right vertex.
203 * - Repeat until all vertices have been matched.
204 *
205 * This algorithm can be run in O(V+E) time (where V is the number
206 * of vertices and E is the number of edges in the graph), and the
207 * only way it can fail is if there is not a unique perfect
208 * matching (either because there is no matching at all, or because
209 * it isn't unique; but it can't distinguish those cases).
210 *
211 * Thus, the internal solver in this source file can be confident
212 * that if the tree/tent matching is uniquely determined by the
213 * tree and tent positions, it can find it using only this kind of
214 * obvious and simple operation: assign a tree to a tent if it
215 * cannot possibly belong to any other tent, and vice versa. If the
216 * solver were _only_ trying to determine the matching, even that
217 * `vice versa' wouldn't be required; but it can come in handy when
218 * not all the tents have been placed yet. I can therefore be
219 * reasonably confident that as long as my solver doesn't need to
220 * cope with grids that have a non-unique matching, it will also
221 * not need to do anything complicated like set analysis between
222 * trees and tents.
223 */
224
225 /*
226 * In standalone solver mode, `verbose' is a variable which can be
227 * set by command-line option; in debugging mode it's simply always
228 * true.
229 */
230 #if defined STANDALONE_SOLVER
231 #define SOLVER_DIAGNOSTICS
232 int verbose = FALSE;
233 #elif defined SOLVER_DIAGNOSTICS
234 #define verbose TRUE
235 #endif
236
237 /*
238 * Difficulty levels. I do some macro ickery here to ensure that my
239 * enum and the various forms of my name list always match up.
240 */
241 #define DIFFLIST(A) \
242 A(EASY,Easy,e) \
243 A(TRICKY,Tricky,t)
244 #define ENUM(upper,title,lower) DIFF_ ## upper,
245 #define TITLE(upper,title,lower) #title,
246 #define ENCODE(upper,title,lower) #lower
247 #define CONFIG(upper,title,lower) ":" #title
248 enum { DIFFLIST(ENUM) DIFFCOUNT };
249 static char const *const tents_diffnames[] = { DIFFLIST(TITLE) };
250 static char const tents_diffchars[] = DIFFLIST(ENCODE);
251 #define DIFFCONFIG DIFFLIST(CONFIG)
252
253 enum {
254 COL_BACKGROUND,
255 COL_GRID,
256 COL_GRASS,
257 COL_TREETRUNK,
258 COL_TREELEAF,
259 COL_TENT,
260 COL_ERROR,
261 COL_ERRTEXT,
262 COL_ERRTRUNK,
263 NCOLOURS
264 };
265
266 enum { BLANK, TREE, TENT, NONTENT, MAGIC };
267
268 struct game_params {
269 int w, h;
270 int diff;
271 };
272
273 struct numbers {
274 int refcount;
275 int *numbers;
276 };
277
278 struct game_state {
279 game_params p;
280 char *grid;
281 struct numbers *numbers;
282 int completed, used_solve;
283 };
284
285 static game_params *default_params(void)
286 {
287 game_params *ret = snew(game_params);
288
289 ret->w = ret->h = 8;
290 ret->diff = DIFF_EASY;
291
292 return ret;
293 }
294
295 static const struct game_params tents_presets[] = {
296 {8, 8, DIFF_EASY},
297 {8, 8, DIFF_TRICKY},
298 {10, 10, DIFF_EASY},
299 {10, 10, DIFF_TRICKY},
300 {15, 15, DIFF_EASY},
301 {15, 15, DIFF_TRICKY},
302 };
303
304 static int game_fetch_preset(int i, char **name, game_params **params)
305 {
306 game_params *ret;
307 char str[80];
308
309 if (i < 0 || i >= lenof(tents_presets))
310 return FALSE;
311
312 ret = snew(game_params);
313 *ret = tents_presets[i];
314
315 sprintf(str, "%dx%d %s", ret->w, ret->h, tents_diffnames[ret->diff]);
316
317 *name = dupstr(str);
318 *params = ret;
319 return TRUE;
320 }
321
322 static void free_params(game_params *params)
323 {
324 sfree(params);
325 }
326
327 static game_params *dup_params(game_params *params)
328 {
329 game_params *ret = snew(game_params);
330 *ret = *params; /* structure copy */
331 return ret;
332 }
333
334 static void decode_params(game_params *params, char const *string)
335 {
336 params->w = params->h = atoi(string);
337 while (*string && isdigit((unsigned char)*string)) string++;
338 if (*string == 'x') {
339 string++;
340 params->h = atoi(string);
341 while (*string && isdigit((unsigned char)*string)) string++;
342 }
343 if (*string == 'd') {
344 int i;
345 string++;
346 for (i = 0; i < DIFFCOUNT; i++)
347 if (*string == tents_diffchars[i])
348 params->diff = i;
349 if (*string) string++;
350 }
351 }
352
353 static char *encode_params(game_params *params, int full)
354 {
355 char buf[120];
356
357 sprintf(buf, "%dx%d", params->w, params->h);
358 if (full)
359 sprintf(buf + strlen(buf), "d%c",
360 tents_diffchars[params->diff]);
361 return dupstr(buf);
362 }
363
364 static config_item *game_configure(game_params *params)
365 {
366 config_item *ret;
367 char buf[80];
368
369 ret = snewn(4, config_item);
370
371 ret[0].name = "Width";
372 ret[0].type = C_STRING;
373 sprintf(buf, "%d", params->w);
374 ret[0].sval = dupstr(buf);
375 ret[0].ival = 0;
376
377 ret[1].name = "Height";
378 ret[1].type = C_STRING;
379 sprintf(buf, "%d", params->h);
380 ret[1].sval = dupstr(buf);
381 ret[1].ival = 0;
382
383 ret[2].name = "Difficulty";
384 ret[2].type = C_CHOICES;
385 ret[2].sval = DIFFCONFIG;
386 ret[2].ival = params->diff;
387
388 ret[3].name = NULL;
389 ret[3].type = C_END;
390 ret[3].sval = NULL;
391 ret[3].ival = 0;
392
393 return ret;
394 }
395
396 static game_params *custom_params(config_item *cfg)
397 {
398 game_params *ret = snew(game_params);
399
400 ret->w = atoi(cfg[0].sval);
401 ret->h = atoi(cfg[1].sval);
402 ret->diff = cfg[2].ival;
403
404 return ret;
405 }
406
407 static char *validate_params(game_params *params, int full)
408 {
409 /*
410 * Generating anything under 4x4 runs into trouble of one kind
411 * or another.
412 */
413 if (params->w < 4 || params->h < 4)
414 return "Width and height must both be at least four";
415 return NULL;
416 }
417
418 /*
419 * Scratch space for solver.
420 */
421 enum { N, U, L, R, D, MAXDIR }; /* link directions */
422 #define dx(d) ( ((d)==R) - ((d)==L) )
423 #define dy(d) ( ((d)==D) - ((d)==U) )
424 #define F(d) ( U + D - (d) )
425 struct solver_scratch {
426 char *links; /* mapping between trees and tents */
427 int *locs;
428 char *place, *mrows, *trows;
429 };
430
431 static struct solver_scratch *new_scratch(int w, int h)
432 {
433 struct solver_scratch *ret = snew(struct solver_scratch);
434
435 ret->links = snewn(w*h, char);
436 ret->locs = snewn(max(w, h), int);
437 ret->place = snewn(max(w, h), char);
438 ret->mrows = snewn(3 * max(w, h), char);
439 ret->trows = snewn(3 * max(w, h), char);
440
441 return ret;
442 }
443
444 static void free_scratch(struct solver_scratch *sc)
445 {
446 sfree(sc->trows);
447 sfree(sc->mrows);
448 sfree(sc->place);
449 sfree(sc->locs);
450 sfree(sc->links);
451 sfree(sc);
452 }
453
454 /*
455 * Solver. Returns 0 for impossibility, 1 for success, 2 for
456 * ambiguity or failure to converge.
457 */
458 static int tents_solve(int w, int h, const char *grid, int *numbers,
459 char *soln, struct solver_scratch *sc, int diff)
460 {
461 int x, y, d, i, j;
462 char *mrow, *mrow1, *mrow2, *trow, *trow1, *trow2;
463
464 /*
465 * Set up solver data.
466 */
467 memset(sc->links, N, w*h);
468
469 /*
470 * Set up solution array.
471 */
472 memcpy(soln, grid, w*h);
473
474 /*
475 * Main solver loop.
476 */
477 while (1) {
478 int done_something = FALSE;
479
480 /*
481 * Any tent which has only one unattached tree adjacent to
482 * it can be tied to that tree.
483 */
484 for (y = 0; y < h; y++)
485 for (x = 0; x < w; x++)
486 if (soln[y*w+x] == TENT && !sc->links[y*w+x]) {
487 int linkd = 0;
488
489 for (d = 1; d < MAXDIR; d++) {
490 int x2 = x + dx(d), y2 = y + dy(d);
491 if (x2 >= 0 && x2 < w && y2 >= 0 && y2 < h &&
492 soln[y2*w+x2] == TREE &&
493 !sc->links[y2*w+x2]) {
494 if (linkd)
495 break; /* found more than one */
496 else
497 linkd = d;
498 }
499 }
500
501 if (d == MAXDIR && linkd == 0) {
502 #ifdef SOLVER_DIAGNOSTICS
503 if (verbose)
504 printf("tent at %d,%d cannot link to anything\n",
505 x, y);
506 #endif
507 return 0; /* no solution exists */
508 } else if (d == MAXDIR) {
509 int x2 = x + dx(linkd), y2 = y + dy(linkd);
510
511 #ifdef SOLVER_DIAGNOSTICS
512 if (verbose)
513 printf("tent at %d,%d can only link to tree at"
514 " %d,%d\n", x, y, x2, y2);
515 #endif
516
517 sc->links[y*w+x] = linkd;
518 sc->links[y2*w+x2] = F(linkd);
519 done_something = TRUE;
520 }
521 }
522
523 if (done_something)
524 continue;
525 if (diff < 0)
526 break; /* don't do anything else! */
527
528 /*
529 * Mark a blank square as NONTENT if it is not orthogonally
530 * adjacent to any unmatched tree.
531 */
532 for (y = 0; y < h; y++)
533 for (x = 0; x < w; x++)
534 if (soln[y*w+x] == BLANK) {
535 int can_be_tent = FALSE;
536
537 for (d = 1; d < MAXDIR; d++) {
538 int x2 = x + dx(d), y2 = y + dy(d);
539 if (x2 >= 0 && x2 < w && y2 >= 0 && y2 < h &&
540 soln[y2*w+x2] == TREE &&
541 !sc->links[y2*w+x2])
542 can_be_tent = TRUE;
543 }
544
545 if (!can_be_tent) {
546 #ifdef SOLVER_DIAGNOSTICS
547 if (verbose)
548 printf("%d,%d cannot be a tent (no adjacent"
549 " unmatched tree)\n", x, y);
550 #endif
551 soln[y*w+x] = NONTENT;
552 done_something = TRUE;
553 }
554 }
555
556 if (done_something)
557 continue;
558
559 /*
560 * Mark a blank square as NONTENT if it is (perhaps
561 * diagonally) adjacent to any other tent.
562 */
563 for (y = 0; y < h; y++)
564 for (x = 0; x < w; x++)
565 if (soln[y*w+x] == BLANK) {
566 int dx, dy, imposs = FALSE;
567
568 for (dy = -1; dy <= +1; dy++)
569 for (dx = -1; dx <= +1; dx++)
570 if (dy || dx) {
571 int x2 = x + dx, y2 = y + dy;
572 if (x2 >= 0 && x2 < w && y2 >= 0 && y2 < h &&
573 soln[y2*w+x2] == TENT)
574 imposs = TRUE;
575 }
576
577 if (imposs) {
578 #ifdef SOLVER_DIAGNOSTICS
579 if (verbose)
580 printf("%d,%d cannot be a tent (adjacent tent)\n",
581 x, y);
582 #endif
583 soln[y*w+x] = NONTENT;
584 done_something = TRUE;
585 }
586 }
587
588 if (done_something)
589 continue;
590
591 /*
592 * Any tree which has exactly one {unattached tent, BLANK}
593 * adjacent to it must have its tent in that square.
594 */
595 for (y = 0; y < h; y++)
596 for (x = 0; x < w; x++)
597 if (soln[y*w+x] == TREE && !sc->links[y*w+x]) {
598 int linkd = 0, linkd2 = 0, nd = 0;
599
600 for (d = 1; d < MAXDIR; d++) {
601 int x2 = x + dx(d), y2 = y + dy(d);
602 if (!(x2 >= 0 && x2 < w && y2 >= 0 && y2 < h))
603 continue;
604 if (soln[y2*w+x2] == BLANK ||
605 (soln[y2*w+x2] == TENT && !sc->links[y2*w+x2])) {
606 if (linkd)
607 linkd2 = d;
608 else
609 linkd = d;
610 nd++;
611 }
612 }
613
614 if (nd == 0) {
615 #ifdef SOLVER_DIAGNOSTICS
616 if (verbose)
617 printf("tree at %d,%d cannot link to anything\n",
618 x, y);
619 #endif
620 return 0; /* no solution exists */
621 } else if (nd == 1) {
622 int x2 = x + dx(linkd), y2 = y + dy(linkd);
623
624 #ifdef SOLVER_DIAGNOSTICS
625 if (verbose)
626 printf("tree at %d,%d can only link to tent at"
627 " %d,%d\n", x, y, x2, y2);
628 #endif
629 soln[y2*w+x2] = TENT;
630 sc->links[y*w+x] = linkd;
631 sc->links[y2*w+x2] = F(linkd);
632 done_something = TRUE;
633 } else if (nd == 2 && (!dx(linkd) != !dx(linkd2)) &&
634 diff >= DIFF_TRICKY) {
635 /*
636 * If there are two possible places where
637 * this tree's tent can go, and they are
638 * diagonally separated rather than being
639 * on opposite sides of the tree, then the
640 * square (other than the tree square)
641 * which is adjacent to both of them must
642 * be a non-tent.
643 */
644 int x2 = x + dx(linkd) + dx(linkd2);
645 int y2 = y + dy(linkd) + dy(linkd2);
646 assert(x2 >= 0 && x2 < w && y2 >= 0 && y2 < h);
647 if (soln[y2*w+x2] == BLANK) {
648 #ifdef SOLVER_DIAGNOSTICS
649 if (verbose)
650 printf("possible tent locations for tree at"
651 " %d,%d rule out tent at %d,%d\n",
652 x, y, x2, y2);
653 #endif
654 soln[y2*w+x2] = NONTENT;
655 done_something = TRUE;
656 }
657 }
658 }
659
660 if (done_something)
661 continue;
662
663 /*
664 * If localised deductions about the trees and tents
665 * themselves haven't helped us, it's time to resort to the
666 * numbers round the grid edge. For each row and column, we
667 * go through all possible combinations of locations for
668 * the unplaced tents, rule out any which have adjacent
669 * tents, and spot any square which is given the same state
670 * by all remaining combinations.
671 */
672 for (i = 0; i < w+h; i++) {
673 int start, step, len, start1, start2, n, k;
674
675 if (i < w) {
676 /*
677 * This is the number for a column.
678 */
679 start = i;
680 step = w;
681 len = h;
682 if (i > 0)
683 start1 = start - 1;
684 else
685 start1 = -1;
686 if (i+1 < w)
687 start2 = start + 1;
688 else
689 start2 = -1;
690 } else {
691 /*
692 * This is the number for a row.
693 */
694 start = (i-w)*w;
695 step = 1;
696 len = w;
697 if (i > w)
698 start1 = start - w;
699 else
700 start1 = -1;
701 if (i+1 < w+h)
702 start2 = start + w;
703 else
704 start2 = -1;
705 }
706
707 if (diff < DIFF_TRICKY) {
708 /*
709 * In Easy mode, we don't look at the effect of one
710 * row on the next (i.e. ruling out a square if all
711 * possibilities for an adjacent row place a tent
712 * next to it).
713 */
714 start1 = start2 = -1;
715 }
716
717 k = numbers[i];
718
719 /*
720 * Count and store the locations of the free squares,
721 * and also count the number of tents already placed.
722 */
723 n = 0;
724 for (j = 0; j < len; j++) {
725 if (soln[start+j*step] == TENT)
726 k--; /* one fewer tent to place */
727 else if (soln[start+j*step] == BLANK)
728 sc->locs[n++] = j;
729 }
730
731 if (n == 0)
732 continue; /* nothing left to do here */
733
734 /*
735 * Now we know we're placing k tents in n squares. Set
736 * up the first possibility.
737 */
738 for (j = 0; j < n; j++)
739 sc->place[j] = (j < k ? TENT : NONTENT);
740
741 /*
742 * We're aiming to find squares in this row which are
743 * invariant over all valid possibilities. Thus, we
744 * maintain the current state of that invariance. We
745 * start everything off at MAGIC to indicate that it
746 * hasn't been set up yet.
747 */
748 mrow = sc->mrows;
749 mrow1 = sc->mrows + len;
750 mrow2 = sc->mrows + 2*len;
751 trow = sc->trows;
752 trow1 = sc->trows + len;
753 trow2 = sc->trows + 2*len;
754 memset(mrow, MAGIC, 3*len);
755
756 /*
757 * And iterate over all possibilities.
758 */
759 while (1) {
760 int p, valid;
761
762 /*
763 * See if this possibility is valid. The only way
764 * it can fail to be valid is if it contains two
765 * adjacent tents. (Other forms of invalidity, such
766 * as containing a tent adjacent to one already
767 * placed, will have been dealt with already by
768 * other parts of the solver.)
769 */
770 valid = TRUE;
771 for (j = 0; j+1 < n; j++)
772 if (sc->place[j] == TENT &&
773 sc->place[j+1] == TENT &&
774 sc->locs[j+1] == sc->locs[j]+1) {
775 valid = FALSE;
776 break;
777 }
778
779 if (valid) {
780 /*
781 * Merge this valid combination into mrow.
782 */
783 memset(trow, MAGIC, len);
784 memset(trow+len, BLANK, 2*len);
785 for (j = 0; j < n; j++) {
786 trow[sc->locs[j]] = sc->place[j];
787 if (sc->place[j] == TENT) {
788 int jj;
789 for (jj = sc->locs[j]-1; jj <= sc->locs[j]+1; jj++)
790 if (jj >= 0 && jj < len)
791 trow1[jj] = trow2[jj] = NONTENT;
792 }
793 }
794
795 for (j = 0; j < 3*len; j++) {
796 if (trow[j] == MAGIC)
797 continue;
798 if (mrow[j] == MAGIC || mrow[j] == trow[j]) {
799 /*
800 * Either this is the first valid
801 * placement we've found at all, or
802 * this square's contents are
803 * consistent with every previous valid
804 * combination.
805 */
806 mrow[j] = trow[j];
807 } else {
808 /*
809 * This square's contents fail to match
810 * what they were in a different
811 * combination, so we cannot deduce
812 * anything about this square.
813 */
814 mrow[j] = BLANK;
815 }
816 }
817 }
818
819 /*
820 * Find the next combination of k choices from n.
821 * We do this by finding the rightmost tent which
822 * can be moved one place right, doing so, and
823 * shunting all tents to the right of that as far
824 * left as they can go.
825 */
826 p = 0;
827 for (j = n-1; j > 0; j--) {
828 if (sc->place[j] == TENT)
829 p++;
830 if (sc->place[j] == NONTENT && sc->place[j-1] == TENT) {
831 sc->place[j-1] = NONTENT;
832 sc->place[j] = TENT;
833 while (p--)
834 sc->place[++j] = TENT;
835 while (++j < n)
836 sc->place[j] = NONTENT;
837 break;
838 }
839 }
840 if (j <= 0)
841 break; /* we've finished */
842 }
843
844 /*
845 * It's just possible that _no_ placement was valid, in
846 * which case we have an internally inconsistent
847 * puzzle.
848 */
849 if (mrow[sc->locs[0]] == MAGIC)
850 return 0; /* inconsistent */
851
852 /*
853 * Now go through mrow and see if there's anything
854 * we've deduced which wasn't already mentioned in soln.
855 */
856 for (j = 0; j < len; j++) {
857 int whichrow;
858
859 for (whichrow = 0; whichrow < 3; whichrow++) {
860 char *mthis = mrow + whichrow * len;
861 int tstart = (whichrow == 0 ? start :
862 whichrow == 1 ? start1 : start2);
863 if (tstart >= 0 &&
864 mthis[j] != MAGIC && mthis[j] != BLANK &&
865 soln[tstart+j*step] == BLANK) {
866 int pos = tstart+j*step;
867
868 #ifdef SOLVER_DIAGNOSTICS
869 if (verbose)
870 printf("%s %d forces %s at %d,%d\n",
871 step==1 ? "row" : "column",
872 step==1 ? start/w : start,
873 mthis[j] == TENT ? "tent" : "non-tent",
874 pos % w, pos / w);
875 #endif
876 soln[pos] = mthis[j];
877 done_something = TRUE;
878 }
879 }
880 }
881 }
882
883 if (done_something)
884 continue;
885
886 if (!done_something)
887 break;
888 }
889
890 /*
891 * The solver has nothing further it can do. Return 1 if both
892 * soln and sc->links are completely filled in, or 2 otherwise.
893 */
894 for (y = 0; y < h; y++)
895 for (x = 0; x < w; x++) {
896 if (soln[y*w+x] == BLANK)
897 return 2;
898 if (soln[y*w+x] != NONTENT && sc->links[y*w+x] == 0)
899 return 2;
900 }
901
902 return 1;
903 }
904
905 static char *new_game_desc(game_params *params, random_state *rs,
906 char **aux, int interactive)
907 {
908 int w = params->w, h = params->h;
909 int ntrees = w * h / 5;
910 char *grid = snewn(w*h, char);
911 char *puzzle = snewn(w*h, char);
912 int *numbers = snewn(w+h, int);
913 char *soln = snewn(w*h, char);
914 int *temp = snewn(2*w*h, int);
915 int maxedges = ntrees*4 + w*h;
916 int *edges = snewn(2*maxedges, int);
917 int *capacity = snewn(maxedges, int);
918 int *flow = snewn(maxedges, int);
919 struct solver_scratch *sc = new_scratch(w, h);
920 char *ret, *p;
921 int i, j, nedges;
922
923 /*
924 * Since this puzzle has many global deductions and doesn't
925 * permit limited clue sets, generating grids for this puzzle
926 * is hard enough that I see no better option than to simply
927 * generate a solution and see if it's unique and has the
928 * required difficulty. This turns out to be computationally
929 * plausible as well.
930 *
931 * We chose our tree count (hence also tent count) by dividing
932 * the total grid area by five above. Why five? Well, w*h/4 is
933 * the maximum number of tents you can _possibly_ fit into the
934 * grid without violating the separation criterion, and to
935 * achieve that you are constrained to a very small set of
936 * possible layouts (the obvious one with a tent at every
937 * (even,even) coordinate, and trivial variations thereon). So
938 * if we reduce the tent count a bit more, we enable more
939 * random-looking placement; 5 turns out to be a plausible
940 * figure which yields sensible puzzles. Increasing the tent
941 * count would give puzzles whose solutions were too regimented
942 * and could be solved by the use of that knowledge (and would
943 * also take longer to find a viable placement); decreasing it
944 * would make the grids emptier and more boring.
945 *
946 * Actually generating a grid is a matter of first placing the
947 * tents, and then placing the trees by the use of maxflow
948 * (finding a distinct square adjacent to every tent). We do it
949 * this way round because otherwise satisfying the tent
950 * separation condition would become onerous: most randomly
951 * chosen tent layouts do not satisfy this condition, so we'd
952 * have gone to a lot of work before finding that a candidate
953 * layout was unusable. Instead, we place the tents first and
954 * ensure they meet the separation criterion _before_ doing
955 * lots of computation; this works much better.
956 *
957 * The maxflow algorithm is not randomised, so employed naively
958 * it would give rise to grids with clear structure and
959 * directional bias. Hence, I assign the network nodes as seen
960 * by maxflow to be a _random_ permutation of the squares of
961 * the grid, so that any bias shown by maxflow towards
962 * low-numbered nodes is turned into a random bias.
963 *
964 * This generation strategy can fail at many points, including
965 * as early as tent placement (if you get a bad random order in
966 * which to greedily try the grid squares, you won't even
967 * manage to find enough mutually non-adjacent squares to put
968 * the tents in). Then it can fail if maxflow doesn't manage to
969 * find a good enough matching (i.e. the tent placements don't
970 * admit any adequate tree placements); and finally it can fail
971 * if the solver finds that the problem has the wrong
972 * difficulty (including being actually non-unique). All of
973 * these, however, are insufficiently frequent to cause
974 * trouble.
975 */
976
977 if (params->diff > DIFF_EASY && params->w <= 4 && params->h <= 4)
978 params->diff = DIFF_EASY; /* downgrade to prevent tight loop */
979
980 while (1) {
981 /*
982 * Arrange the grid squares into a random order.
983 */
984 for (i = 0; i < w*h; i++)
985 temp[i] = i;
986 shuffle(temp, w*h, sizeof(*temp), rs);
987
988 /*
989 * The first `ntrees' entries in temp which we can get
990 * without making two tents adjacent will be the tent
991 * locations.
992 */
993 memset(grid, BLANK, w*h);
994 j = ntrees;
995 for (i = 0; i < w*h && j > 0; i++) {
996 int x = temp[i] % w, y = temp[i] / w;
997 int dy, dx, ok = TRUE;
998
999 for (dy = -1; dy <= +1; dy++)
1000 for (dx = -1; dx <= +1; dx++)
1001 if (x+dx >= 0 && x+dx < w &&
1002 y+dy >= 0 && y+dy < h &&
1003 grid[(y+dy)*w+(x+dx)] == TENT)
1004 ok = FALSE;
1005
1006 if (ok) {
1007 grid[temp[i]] = TENT;
1008 j--;
1009 }
1010 }
1011 if (j > 0)
1012 continue; /* couldn't place all the tents */
1013
1014 /*
1015 * Now we build up the list of graph edges.
1016 */
1017 nedges = 0;
1018 for (i = 0; i < w*h; i++) {
1019 if (grid[temp[i]] == TENT) {
1020 for (j = 0; j < w*h; j++) {
1021 if (grid[temp[j]] != TENT) {
1022 int xi = temp[i] % w, yi = temp[i] / w;
1023 int xj = temp[j] % w, yj = temp[j] / w;
1024 if (abs(xi-xj) + abs(yi-yj) == 1) {
1025 edges[nedges*2] = i;
1026 edges[nedges*2+1] = j;
1027 capacity[nedges] = 1;
1028 nedges++;
1029 }
1030 }
1031 }
1032 } else {
1033 /*
1034 * Special node w*h is the sink node; any non-tent node
1035 * has an edge going to it.
1036 */
1037 edges[nedges*2] = i;
1038 edges[nedges*2+1] = w*h;
1039 capacity[nedges] = 1;
1040 nedges++;
1041 }
1042 }
1043
1044 /*
1045 * Special node w*h+1 is the source node, with an edge going to
1046 * every tent.
1047 */
1048 for (i = 0; i < w*h; i++) {
1049 if (grid[temp[i]] == TENT) {
1050 edges[nedges*2] = w*h+1;
1051 edges[nedges*2+1] = i;
1052 capacity[nedges] = 1;
1053 nedges++;
1054 }
1055 }
1056
1057 assert(nedges <= maxedges);
1058
1059 /*
1060 * Now we're ready to call the maxflow algorithm to place the
1061 * trees.
1062 */
1063 j = maxflow(w*h+2, w*h+1, w*h, nedges, edges, capacity, flow, NULL);
1064
1065 if (j < ntrees)
1066 continue; /* couldn't place all the tents */
1067
1068 /*
1069 * We've placed the trees. Now we need to work out _where_
1070 * we've placed them, which is a matter of reading back out
1071 * from the `flow' array.
1072 */
1073 for (i = 0; i < nedges; i++) {
1074 if (edges[2*i] < w*h && edges[2*i+1] < w*h && flow[i] > 0)
1075 grid[temp[edges[2*i+1]]] = TREE;
1076 }
1077
1078 /*
1079 * I think it looks ugly if there isn't at least one of
1080 * _something_ (tent or tree) in each row and each column
1081 * of the grid. This doesn't give any information away
1082 * since a completely empty row/column is instantly obvious
1083 * from the clues (it has no trees and a zero).
1084 */
1085 for (i = 0; i < w; i++) {
1086 for (j = 0; j < h; j++) {
1087 if (grid[j*w+i] != BLANK)
1088 break; /* found something in this column */
1089 }
1090 if (j == h)
1091 break; /* found empty column */
1092 }
1093 if (i < w)
1094 continue; /* a column was empty */
1095
1096 for (j = 0; j < h; j++) {
1097 for (i = 0; i < w; i++) {
1098 if (grid[j*w+i] != BLANK)
1099 break; /* found something in this row */
1100 }
1101 if (i == w)
1102 break; /* found empty row */
1103 }
1104 if (j < h)
1105 continue; /* a row was empty */
1106
1107 /*
1108 * Now set up the numbers round the edge.
1109 */
1110 for (i = 0; i < w; i++) {
1111 int n = 0;
1112 for (j = 0; j < h; j++)
1113 if (grid[j*w+i] == TENT)
1114 n++;
1115 numbers[i] = n;
1116 }
1117 for (i = 0; i < h; i++) {
1118 int n = 0;
1119 for (j = 0; j < w; j++)
1120 if (grid[i*w+j] == TENT)
1121 n++;
1122 numbers[w+i] = n;
1123 }
1124
1125 /*
1126 * And now actually solve the puzzle, to see whether it's
1127 * unique and has the required difficulty.
1128 */
1129 for (i = 0; i < w*h; i++)
1130 puzzle[i] = grid[i] == TREE ? TREE : BLANK;
1131 i = tents_solve(w, h, puzzle, numbers, soln, sc, params->diff-1);
1132 j = tents_solve(w, h, puzzle, numbers, soln, sc, params->diff);
1133
1134 /*
1135 * We expect solving with difficulty params->diff to have
1136 * succeeded (otherwise the problem is too hard), and
1137 * solving with diff-1 to have failed (otherwise it's too
1138 * easy).
1139 */
1140 if (i == 2 && j == 1)
1141 break;
1142 }
1143
1144 /*
1145 * That's it. Encode as a game ID.
1146 */
1147 ret = snewn((w+h)*40 + ntrees + (w*h)/26 + 1, char);
1148 p = ret;
1149 j = 0;
1150 for (i = 0; i <= w*h; i++) {
1151 int c = (i < w*h ? grid[i] == TREE : 1);
1152 if (c) {
1153 *p++ = (j == 0 ? '_' : j-1 + 'a');
1154 j = 0;
1155 } else {
1156 j++;
1157 while (j > 25) {
1158 *p++ = 'z';
1159 j -= 25;
1160 }
1161 }
1162 }
1163 for (i = 0; i < w+h; i++)
1164 p += sprintf(p, ",%d", numbers[i]);
1165 *p++ = '\0';
1166 ret = sresize(ret, p - ret, char);
1167
1168 /*
1169 * And encode the solution as an aux_info.
1170 */
1171 *aux = snewn(ntrees * 40, char);
1172 p = *aux;
1173 *p++ = 'S';
1174 for (i = 0; i < w*h; i++)
1175 if (grid[i] == TENT)
1176 p += sprintf(p, ";T%d,%d", i%w, i/w);
1177 *p++ = '\0';
1178 *aux = sresize(*aux, p - *aux, char);
1179
1180 free_scratch(sc);
1181 sfree(flow);
1182 sfree(capacity);
1183 sfree(edges);
1184 sfree(temp);
1185 sfree(soln);
1186 sfree(numbers);
1187 sfree(puzzle);
1188 sfree(grid);
1189
1190 return ret;
1191 }
1192
1193 static char *validate_desc(game_params *params, char *desc)
1194 {
1195 int w = params->w, h = params->h;
1196 int area, i;
1197
1198 area = 0;
1199 while (*desc && *desc != ',') {
1200 if (*desc == '_')
1201 area++;
1202 else if (*desc >= 'a' && *desc < 'z')
1203 area += *desc - 'a' + 2;
1204 else if (*desc == 'z')
1205 area += 25;
1206 else if (*desc == '!' || *desc == '-')
1207 /* do nothing */;
1208 else
1209 return "Invalid character in grid specification";
1210
1211 desc++;
1212 }
1213 if (area < w * h + 1)
1214 return "Not enough data to fill grid";
1215 else if (area > w * h + 1)
1216 return "Too much data to fill grid";
1217
1218 for (i = 0; i < w+h; i++) {
1219 if (!*desc)
1220 return "Not enough numbers given after grid specification";
1221 else if (*desc != ',')
1222 return "Invalid character in number list";
1223 desc++;
1224 while (*desc && isdigit((unsigned char)*desc)) desc++;
1225 }
1226
1227 if (*desc)
1228 return "Unexpected additional data at end of game description";
1229 return NULL;
1230 }
1231
1232 static game_state *new_game(midend *me, game_params *params, char *desc)
1233 {
1234 int w = params->w, h = params->h;
1235 game_state *state = snew(game_state);
1236 int i;
1237
1238 state->p = *params; /* structure copy */
1239 state->grid = snewn(w*h, char);
1240 state->numbers = snew(struct numbers);
1241 state->numbers->refcount = 1;
1242 state->numbers->numbers = snewn(w+h, int);
1243 state->completed = state->used_solve = FALSE;
1244
1245 i = 0;
1246 memset(state->grid, BLANK, w*h);
1247
1248 while (*desc) {
1249 int run, type;
1250
1251 type = TREE;
1252
1253 if (*desc == '_')
1254 run = 0;
1255 else if (*desc >= 'a' && *desc < 'z')
1256 run = *desc - ('a'-1);
1257 else if (*desc == 'z') {
1258 run = 25;
1259 type = BLANK;
1260 } else {
1261 assert(*desc == '!' || *desc == '-');
1262 run = -1;
1263 type = (*desc == '!' ? TENT : NONTENT);
1264 }
1265
1266 desc++;
1267
1268 i += run;
1269 assert(i >= 0 && i <= w*h);
1270 if (i == w*h) {
1271 assert(type == TREE);
1272 break;
1273 } else {
1274 if (type != BLANK)
1275 state->grid[i++] = type;
1276 }
1277 }
1278
1279 for (i = 0; i < w+h; i++) {
1280 assert(*desc == ',');
1281 desc++;
1282 state->numbers->numbers[i] = atoi(desc);
1283 while (*desc && isdigit((unsigned char)*desc)) desc++;
1284 }
1285
1286 assert(!*desc);
1287
1288 return state;
1289 }
1290
1291 static game_state *dup_game(game_state *state)
1292 {
1293 int w = state->p.w, h = state->p.h;
1294 game_state *ret = snew(game_state);
1295
1296 ret->p = state->p; /* structure copy */
1297 ret->grid = snewn(w*h, char);
1298 memcpy(ret->grid, state->grid, w*h);
1299 ret->numbers = state->numbers;
1300 state->numbers->refcount++;
1301 ret->completed = state->completed;
1302 ret->used_solve = state->used_solve;
1303
1304 return ret;
1305 }
1306
1307 static void free_game(game_state *state)
1308 {
1309 if (--state->numbers->refcount <= 0) {
1310 sfree(state->numbers->numbers);
1311 sfree(state->numbers);
1312 }
1313 sfree(state->grid);
1314 sfree(state);
1315 }
1316
1317 static char *solve_game(game_state *state, game_state *currstate,
1318 char *aux, char **error)
1319 {
1320 int w = state->p.w, h = state->p.h;
1321
1322 if (aux) {
1323 /*
1324 * If we already have the solution, save ourselves some
1325 * time.
1326 */
1327 return dupstr(aux);
1328 } else {
1329 struct solver_scratch *sc = new_scratch(w, h);
1330 char *soln;
1331 int ret;
1332 char *move, *p;
1333 int i;
1334
1335 soln = snewn(w*h, char);
1336 ret = tents_solve(w, h, state->grid, state->numbers->numbers,
1337 soln, sc, DIFFCOUNT-1);
1338 free_scratch(sc);
1339 if (ret != 1) {
1340 sfree(soln);
1341 if (ret == 0)
1342 *error = "This puzzle is not self-consistent";
1343 else
1344 *error = "Unable to find a unique solution for this puzzle";
1345 return NULL;
1346 }
1347
1348 /*
1349 * Construct a move string which turns the current state
1350 * into the solved state.
1351 */
1352 move = snewn(w*h * 40, char);
1353 p = move;
1354 *p++ = 'S';
1355 for (i = 0; i < w*h; i++)
1356 if (soln[i] == TENT)
1357 p += sprintf(p, ";T%d,%d", i%w, i/w);
1358 *p++ = '\0';
1359 move = sresize(move, p - move, char);
1360
1361 sfree(soln);
1362
1363 return move;
1364 }
1365 }
1366
1367 static int game_can_format_as_text_now(game_params *params)
1368 {
1369 return TRUE;
1370 }
1371
1372 static char *game_text_format(game_state *state)
1373 {
1374 int w = state->p.w, h = state->p.h;
1375 char *ret, *p;
1376 int x, y;
1377
1378 /*
1379 * FIXME: We currently do not print the numbers round the edges
1380 * of the grid. I need to work out a sensible way of doing this
1381 * even when the column numbers exceed 9.
1382 *
1383 * In the absence of those numbers, the result size is h lines
1384 * of w+1 characters each, plus a NUL.
1385 *
1386 * This function is currently only used by the standalone
1387 * solver; until I make it look more sensible, I won't enable
1388 * it in the main game structure.
1389 */
1390 ret = snewn(h*(w+1) + 1, char);
1391 p = ret;
1392 for (y = 0; y < h; y++) {
1393 for (x = 0; x < w; x++) {
1394 *p = (state->grid[y*w+x] == BLANK ? '.' :
1395 state->grid[y*w+x] == TREE ? 'T' :
1396 state->grid[y*w+x] == TENT ? '*' :
1397 state->grid[y*w+x] == NONTENT ? '-' : '?');
1398 p++;
1399 }
1400 *p++ = '\n';
1401 }
1402 *p++ = '\0';
1403
1404 return ret;
1405 }
1406
1407 struct game_ui {
1408 int dsx, dsy; /* coords of drag start */
1409 int dex, dey; /* coords of drag end */
1410 int drag_button; /* -1 for none, or a button code */
1411 int drag_ok; /* dragged off the window, to cancel */
1412
1413 int cx, cy, cdisp; /* cursor position, and ?display. */
1414 };
1415
1416 static game_ui *new_ui(game_state *state)
1417 {
1418 game_ui *ui = snew(game_ui);
1419 ui->dsx = ui->dsy = -1;
1420 ui->dex = ui->dey = -1;
1421 ui->drag_button = -1;
1422 ui->drag_ok = FALSE;
1423 ui->cx = ui->cy = ui->cdisp = 0;
1424 return ui;
1425 }
1426
1427 static void free_ui(game_ui *ui)
1428 {
1429 sfree(ui);
1430 }
1431
1432 static char *encode_ui(game_ui *ui)
1433 {
1434 return NULL;
1435 }
1436
1437 static void decode_ui(game_ui *ui, char *encoding)
1438 {
1439 }
1440
1441 static void game_changed_state(game_ui *ui, game_state *oldstate,
1442 game_state *newstate)
1443 {
1444 }
1445
1446 struct game_drawstate {
1447 int tilesize;
1448 int started;
1449 game_params p;
1450 int *drawn, *numbersdrawn;
1451 int cx, cy; /* last-drawn cursor pos, or (-1,-1) if absent. */
1452 };
1453
1454 #define PREFERRED_TILESIZE 32
1455 #define TILESIZE (ds->tilesize)
1456 #define TLBORDER (TILESIZE/2)
1457 #define BRBORDER (TILESIZE*3/2)
1458 #define COORD(x) ( (x) * TILESIZE + TLBORDER )
1459 #define FROMCOORD(x) ( ((x) - TLBORDER + TILESIZE) / TILESIZE - 1 )
1460
1461 #define FLASH_TIME 0.30F
1462
1463 static int drag_xform(game_ui *ui, int x, int y, int v)
1464 {
1465 int xmin, ymin, xmax, ymax;
1466
1467 xmin = min(ui->dsx, ui->dex);
1468 xmax = max(ui->dsx, ui->dex);
1469 ymin = min(ui->dsy, ui->dey);
1470 ymax = max(ui->dsy, ui->dey);
1471
1472 #ifndef STYLUS_BASED
1473 /*
1474 * Left-dragging has no effect, so we treat a left-drag as a
1475 * single click on dsx,dsy.
1476 */
1477 if (ui->drag_button == LEFT_BUTTON) {
1478 xmin = xmax = ui->dsx;
1479 ymin = ymax = ui->dsy;
1480 }
1481 #endif
1482
1483 if (x < xmin || x > xmax || y < ymin || y > ymax)
1484 return v; /* no change outside drag area */
1485
1486 if (v == TREE)
1487 return v; /* trees are inviolate always */
1488
1489 if (xmin == xmax && ymin == ymax) {
1490 /*
1491 * Results of a simple click. Left button sets blanks to
1492 * tents; right button sets blanks to non-tents; either
1493 * button clears a non-blank square.
1494 * If stylus-based however, it loops instead.
1495 */
1496 if (ui->drag_button == LEFT_BUTTON)
1497 #ifdef STYLUS_BASED
1498 v = (v == BLANK ? TENT : (v == TENT ? NONTENT : BLANK));
1499 else
1500 v = (v == BLANK ? NONTENT : (v == NONTENT ? TENT : BLANK));
1501 #else
1502 v = (v == BLANK ? TENT : BLANK);
1503 else
1504 v = (v == BLANK ? NONTENT : BLANK);
1505 #endif
1506 } else {
1507 /*
1508 * Results of a drag. Left-dragging has no effect.
1509 * Right-dragging sets all blank squares to non-tents and
1510 * has no effect on anything else.
1511 */
1512 if (ui->drag_button == RIGHT_BUTTON)
1513 v = (v == BLANK ? NONTENT : v);
1514 else
1515 #ifdef STYLUS_BASED
1516 v = (v == BLANK ? NONTENT : v);
1517 #else
1518 /* do nothing */;
1519 #endif
1520 }
1521
1522 return v;
1523 }
1524
1525 static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
1526 int x, int y, int button)
1527 {
1528 int w = state->p.w, h = state->p.h;
1529 char tmpbuf[80];
1530
1531 if (button == LEFT_BUTTON || button == RIGHT_BUTTON) {
1532 x = FROMCOORD(x);
1533 y = FROMCOORD(y);
1534 if (x < 0 || y < 0 || x >= w || y >= h)
1535 return NULL;
1536
1537 ui->drag_button = button;
1538 ui->dsx = ui->dex = x;
1539 ui->dsy = ui->dey = y;
1540 ui->drag_ok = TRUE;
1541 ui->cdisp = 0;
1542 return ""; /* ui updated */
1543 }
1544
1545 if ((IS_MOUSE_DRAG(button) || IS_MOUSE_RELEASE(button)) &&
1546 ui->drag_button > 0) {
1547 int xmin, ymin, xmax, ymax;
1548 char *buf, *sep;
1549 int buflen, bufsize, tmplen;
1550
1551 x = FROMCOORD(x);
1552 y = FROMCOORD(y);
1553 if (x < 0 || y < 0 || x >= w || y >= h) {
1554 ui->drag_ok = FALSE;
1555 } else {
1556 /*
1557 * Drags are limited to one row or column. Hence, we
1558 * work out which coordinate is closer to the drag
1559 * start, and move it _to_ the drag start.
1560 */
1561 if (abs(x - ui->dsx) < abs(y - ui->dsy))
1562 x = ui->dsx;
1563 else
1564 y = ui->dsy;
1565
1566 ui->dex = x;
1567 ui->dey = y;
1568
1569 ui->drag_ok = TRUE;
1570 }
1571
1572 if (IS_MOUSE_DRAG(button))
1573 return ""; /* ui updated */
1574
1575 /*
1576 * The drag has been released. Enact it.
1577 */
1578 if (!ui->drag_ok) {
1579 ui->drag_button = -1;
1580 return ""; /* drag was just cancelled */
1581 }
1582
1583 xmin = min(ui->dsx, ui->dex);
1584 xmax = max(ui->dsx, ui->dex);
1585 ymin = min(ui->dsy, ui->dey);
1586 ymax = max(ui->dsy, ui->dey);
1587 assert(0 <= xmin && xmin <= xmax && xmax < w);
1588 assert(0 <= ymin && ymin <= ymax && ymax < h);
1589
1590 buflen = 0;
1591 bufsize = 256;
1592 buf = snewn(bufsize, char);
1593 sep = "";
1594 for (y = ymin; y <= ymax; y++)
1595 for (x = xmin; x <= xmax; x++) {
1596 int v = drag_xform(ui, x, y, state->grid[y*w+x]);
1597 if (state->grid[y*w+x] != v) {
1598 tmplen = sprintf(tmpbuf, "%s%c%d,%d", sep,
1599 (int)(v == BLANK ? 'B' :
1600 v == TENT ? 'T' : 'N'),
1601 x, y);
1602 sep = ";";
1603
1604 if (buflen + tmplen >= bufsize) {
1605 bufsize = buflen + tmplen + 256;
1606 buf = sresize(buf, bufsize, char);
1607 }
1608
1609 strcpy(buf+buflen, tmpbuf);
1610 buflen += tmplen;
1611 }
1612 }
1613
1614 ui->drag_button = -1; /* drag is terminated */
1615
1616 if (buflen == 0) {
1617 sfree(buf);
1618 return ""; /* ui updated (drag was terminated) */
1619 } else {
1620 buf[buflen] = '\0';
1621 return buf;
1622 }
1623 }
1624
1625 if (IS_CURSOR_MOVE(button)) {
1626 move_cursor(button, &ui->cx, &ui->cy, w, h, 0);
1627 ui->cdisp = 1;
1628 return "";
1629 }
1630 if (ui->cdisp) {
1631 char rep = 0;
1632 int v = state->grid[ui->cy*w+ui->cx];
1633
1634 if (v != TREE) {
1635 #ifdef SINGLE_CURSOR_SELECT
1636 if (button == CURSOR_SELECT)
1637 /* SELECT cycles T, N, B */
1638 rep = v == BLANK ? 'T' : v == TENT ? 'N' : 'B';
1639 #else
1640 if (button == CURSOR_SELECT)
1641 rep = v == BLANK ? 'T' : 'B';
1642 else if (button == CURSOR_SELECT2)
1643 rep = v == BLANK ? 'N' : 'B';
1644 else if (button == 'T' || button == 'N' || button == 'B')
1645 rep = (char)button;
1646 #endif
1647 }
1648
1649 if (rep) {
1650 sprintf(tmpbuf, "%c%d,%d", (int)rep, ui->cx, ui->cy);
1651 return dupstr(tmpbuf);
1652 }
1653 } else if (IS_CURSOR_SELECT(button)) {
1654 ui->cdisp = 1;
1655 return "";
1656 }
1657
1658 return NULL;
1659 }
1660
1661 static game_state *execute_move(game_state *state, char *move)
1662 {
1663 int w = state->p.w, h = state->p.h;
1664 char c;
1665 int x, y, m, n, i, j;
1666 game_state *ret = dup_game(state);
1667
1668 while (*move) {
1669 c = *move;
1670 if (c == 'S') {
1671 int i;
1672 ret->used_solve = TRUE;
1673 /*
1674 * Set all non-tree squares to NONTENT. The rest of the
1675 * solve move will fill the tents in over the top.
1676 */
1677 for (i = 0; i < w*h; i++)
1678 if (ret->grid[i] != TREE)
1679 ret->grid[i] = NONTENT;
1680 move++;
1681 } else if (c == 'B' || c == 'T' || c == 'N') {
1682 move++;
1683 if (sscanf(move, "%d,%d%n", &x, &y, &n) != 2 ||
1684 x < 0 || y < 0 || x >= w || y >= h) {
1685 free_game(ret);
1686 return NULL;
1687 }
1688 if (ret->grid[y*w+x] == TREE) {
1689 free_game(ret);
1690 return NULL;
1691 }
1692 ret->grid[y*w+x] = (c == 'B' ? BLANK : c == 'T' ? TENT : NONTENT);
1693 move += n;
1694 } else {
1695 free_game(ret);
1696 return NULL;
1697 }
1698 if (*move == ';')
1699 move++;
1700 else if (*move) {
1701 free_game(ret);
1702 return NULL;
1703 }
1704 }
1705
1706 /*
1707 * Check for completion.
1708 */
1709 for (i = n = m = 0; i < w*h; i++) {
1710 if (ret->grid[i] == TENT)
1711 n++;
1712 else if (ret->grid[i] == TREE)
1713 m++;
1714 }
1715 if (n == m) {
1716 int nedges, maxedges, *edges, *capacity, *flow;
1717
1718 /*
1719 * We have the right number of tents, which is a
1720 * precondition for the game being complete. Now check that
1721 * the numbers add up.
1722 */
1723 for (i = 0; i < w; i++) {
1724 n = 0;
1725 for (j = 0; j < h; j++)
1726 if (ret->grid[j*w+i] == TENT)
1727 n++;
1728 if (ret->numbers->numbers[i] != n)
1729 goto completion_check_done;
1730 }
1731 for (i = 0; i < h; i++) {
1732 n = 0;
1733 for (j = 0; j < w; j++)
1734 if (ret->grid[i*w+j] == TENT)
1735 n++;
1736 if (ret->numbers->numbers[w+i] != n)
1737 goto completion_check_done;
1738 }
1739 /*
1740 * Also, check that no two tents are adjacent.
1741 */
1742 for (y = 0; y < h; y++)
1743 for (x = 0; x < w; x++) {
1744 if (x+1 < w &&
1745 ret->grid[y*w+x] == TENT && ret->grid[y*w+x+1] == TENT)
1746 goto completion_check_done;
1747 if (y+1 < h &&
1748 ret->grid[y*w+x] == TENT && ret->grid[(y+1)*w+x] == TENT)
1749 goto completion_check_done;
1750 if (x+1 < w && y+1 < h) {
1751 if (ret->grid[y*w+x] == TENT &&
1752 ret->grid[(y+1)*w+(x+1)] == TENT)
1753 goto completion_check_done;
1754 if (ret->grid[(y+1)*w+x] == TENT &&
1755 ret->grid[y*w+(x+1)] == TENT)
1756 goto completion_check_done;
1757 }
1758 }
1759
1760 /*
1761 * OK; we have the right number of tents, they match the
1762 * numeric clues, and they satisfy the non-adjacency
1763 * criterion. Finally, we need to verify that they can be
1764 * placed in a one-to-one matching with the trees such that
1765 * every tent is orthogonally adjacent to its tree.
1766 *
1767 * This bit is where the hard work comes in: we have to do
1768 * it by finding such a matching using maxflow.
1769 *
1770 * So we construct a network with one special source node,
1771 * one special sink node, one node per tent, and one node
1772 * per tree.
1773 */
1774 maxedges = 6 * m;
1775 edges = snewn(2 * maxedges, int);
1776 capacity = snewn(maxedges, int);
1777 flow = snewn(maxedges, int);
1778 nedges = 0;
1779 /*
1780 * Node numbering:
1781 *
1782 * 0..w*h trees/tents
1783 * w*h source
1784 * w*h+1 sink
1785 */
1786 for (y = 0; y < h; y++)
1787 for (x = 0; x < w; x++)
1788 if (ret->grid[y*w+x] == TREE) {
1789 int d;
1790
1791 /*
1792 * Here we use the direction enum declared for
1793 * the solver. We make use of the fact that the
1794 * directions are declared in the order
1795 * U,L,R,D, meaning that we go through the four
1796 * neighbours of any square in numerically
1797 * increasing order.
1798 */
1799 for (d = 1; d < MAXDIR; d++) {
1800 int x2 = x + dx(d), y2 = y + dy(d);
1801 if (x2 >= 0 && x2 < w && y2 >= 0 && y2 < h &&
1802 ret->grid[y2*w+x2] == TENT) {
1803 assert(nedges < maxedges);
1804 edges[nedges*2] = y*w+x;
1805 edges[nedges*2+1] = y2*w+x2;
1806 capacity[nedges] = 1;
1807 nedges++;
1808 }
1809 }
1810 } else if (ret->grid[y*w+x] == TENT) {
1811 assert(nedges < maxedges);
1812 edges[nedges*2] = y*w+x;
1813 edges[nedges*2+1] = w*h+1; /* edge going to sink */
1814 capacity[nedges] = 1;
1815 nedges++;
1816 }
1817 for (y = 0; y < h; y++)
1818 for (x = 0; x < w; x++)
1819 if (ret->grid[y*w+x] == TREE) {
1820 assert(nedges < maxedges);
1821 edges[nedges*2] = w*h; /* edge coming from source */
1822 edges[nedges*2+1] = y*w+x;
1823 capacity[nedges] = 1;
1824 nedges++;
1825 }
1826 n = maxflow(w*h+2, w*h, w*h+1, nedges, edges, capacity, flow, NULL);
1827
1828 sfree(flow);
1829 sfree(capacity);
1830 sfree(edges);
1831
1832 if (n != m)
1833 goto completion_check_done;
1834
1835 /*
1836 * We haven't managed to fault the grid on any count. Score!
1837 */
1838 ret->completed = TRUE;
1839 }
1840 completion_check_done:
1841
1842 return ret;
1843 }
1844
1845 /* ----------------------------------------------------------------------
1846 * Drawing routines.
1847 */
1848
1849 static void game_compute_size(game_params *params, int tilesize,
1850 int *x, int *y)
1851 {
1852 /* fool the macros */
1853 struct dummy { int tilesize; } dummy, *ds = &dummy;
1854 dummy.tilesize = tilesize;
1855
1856 *x = TLBORDER + BRBORDER + TILESIZE * params->w;
1857 *y = TLBORDER + BRBORDER + TILESIZE * params->h;
1858 }
1859
1860 static void game_set_size(drawing *dr, game_drawstate *ds,
1861 game_params *params, int tilesize)
1862 {
1863 ds->tilesize = tilesize;
1864 }
1865
1866 static float *game_colours(frontend *fe, int *ncolours)
1867 {
1868 float *ret = snewn(3 * NCOLOURS, float);
1869
1870 frontend_default_colour(fe, &ret[COL_BACKGROUND * 3]);
1871
1872 ret[COL_GRID * 3 + 0] = 0.0F;
1873 ret[COL_GRID * 3 + 1] = 0.0F;
1874 ret[COL_GRID * 3 + 2] = 0.0F;
1875
1876 ret[COL_GRASS * 3 + 0] = 0.7F;
1877 ret[COL_GRASS * 3 + 1] = 1.0F;
1878 ret[COL_GRASS * 3 + 2] = 0.5F;
1879
1880 ret[COL_TREETRUNK * 3 + 0] = 0.6F;
1881 ret[COL_TREETRUNK * 3 + 1] = 0.4F;
1882 ret[COL_TREETRUNK * 3 + 2] = 0.0F;
1883
1884 ret[COL_TREELEAF * 3 + 0] = 0.0F;
1885 ret[COL_TREELEAF * 3 + 1] = 0.7F;
1886 ret[COL_TREELEAF * 3 + 2] = 0.0F;
1887
1888 ret[COL_TENT * 3 + 0] = 0.8F;
1889 ret[COL_TENT * 3 + 1] = 0.7F;
1890 ret[COL_TENT * 3 + 2] = 0.0F;
1891
1892 ret[COL_ERROR * 3 + 0] = 1.0F;
1893 ret[COL_ERROR * 3 + 1] = 0.0F;
1894 ret[COL_ERROR * 3 + 2] = 0.0F;
1895
1896 ret[COL_ERRTEXT * 3 + 0] = 1.0F;
1897 ret[COL_ERRTEXT * 3 + 1] = 1.0F;
1898 ret[COL_ERRTEXT * 3 + 2] = 1.0F;
1899
1900 ret[COL_ERRTRUNK * 3 + 0] = 0.6F;
1901 ret[COL_ERRTRUNK * 3 + 1] = 0.0F;
1902 ret[COL_ERRTRUNK * 3 + 2] = 0.0F;
1903
1904 *ncolours = NCOLOURS;
1905 return ret;
1906 }
1907
1908 static game_drawstate *game_new_drawstate(drawing *dr, game_state *state)
1909 {
1910 int w = state->p.w, h = state->p.h;
1911 struct game_drawstate *ds = snew(struct game_drawstate);
1912 int i;
1913
1914 ds->tilesize = 0;
1915 ds->started = FALSE;
1916 ds->p = state->p; /* structure copy */
1917 ds->drawn = snewn(w*h, int);
1918 for (i = 0; i < w*h; i++)
1919 ds->drawn[i] = MAGIC;
1920 ds->numbersdrawn = snewn(w+h, int);
1921 for (i = 0; i < w+h; i++)
1922 ds->numbersdrawn[i] = 2;
1923 ds->cx = ds->cy = -1;
1924
1925 return ds;
1926 }
1927
1928 static void game_free_drawstate(drawing *dr, game_drawstate *ds)
1929 {
1930 sfree(ds->drawn);
1931 sfree(ds->numbersdrawn);
1932 sfree(ds);
1933 }
1934
1935 enum {
1936 ERR_ADJ_TOPLEFT = 4,
1937 ERR_ADJ_TOP,
1938 ERR_ADJ_TOPRIGHT,
1939 ERR_ADJ_LEFT,
1940 ERR_ADJ_RIGHT,
1941 ERR_ADJ_BOTLEFT,
1942 ERR_ADJ_BOT,
1943 ERR_ADJ_BOTRIGHT,
1944 ERR_OVERCOMMITTED
1945 };
1946
1947 static int *find_errors(game_state *state, char *grid)
1948 {
1949 int w = state->p.w, h = state->p.h;
1950 int *ret = snewn(w*h + w + h, int);
1951 int *tmp = snewn(w*h*2, int), *dsf = tmp + w*h;
1952 int x, y;
1953
1954 /*
1955 * This function goes through a grid and works out where to
1956 * highlight play errors in red. The aim is that it should
1957 * produce at least one error highlight for any complete grid
1958 * (or complete piece of grid) violating a puzzle constraint, so
1959 * that a grid containing no BLANK squares is either a win or is
1960 * marked up in some way that indicates why not.
1961 *
1962 * So it's easy enough to highlight errors in the numeric clues
1963 * - just light up any row or column number which is not
1964 * fulfilled - and it's just as easy to highlight adjacent
1965 * tents. The difficult bit is highlighting failures in the
1966 * tent/tree matching criterion.
1967 *
1968 * A natural approach would seem to be to apply the maxflow
1969 * algorithm to find the tent/tree matching; if this fails, it
1970 * must necessarily terminate with a min-cut which can be
1971 * reinterpreted as some set of trees which have too few tents
1972 * between them (or vice versa). However, it's bad for
1973 * localising errors, because it's not easy to make the
1974 * algorithm narrow down to the _smallest_ such set of trees: if
1975 * trees A and B have only one tent between them, for instance,
1976 * it might perfectly well highlight not only A and B but also
1977 * trees C and D which are correctly matched on the far side of
1978 * the grid, on the grounds that those four trees between them
1979 * have only three tents.
1980 *
1981 * Also, that approach fares badly when you introduce the
1982 * additional requirement that incomplete grids should have
1983 * errors highlighted only when they can be proved to be errors
1984 * - so that trees should not be marked as having too few tents
1985 * if there are enough BLANK squares remaining around them that
1986 * could be turned into the missing tents (to do so would be
1987 * patronising, since the overwhelming likelihood is not that
1988 * the player has forgotten to put a tree there but that they
1989 * have merely not put one there _yet_). However, tents with too
1990 * few trees can be marked immediately, since those are
1991 * definitely player error.
1992 *
1993 * So I adopt an alternative approach, which is to consider the
1994 * bipartite adjacency graph between trees and tents
1995 * ('bipartite' in the sense that for these purposes I
1996 * deliberately ignore two adjacent trees or two adjacent
1997 * tents), divide that graph up into its connected components
1998 * using a dsf, and look for components which contain different
1999 * numbers of trees and tents. This allows me to highlight
2000 * groups of tents with too few trees between them immediately,
2001 * and then in order to find groups of trees with too few tents
2002 * I redo the same process but counting BLANKs as potential
2003 * tents (so that the only trees highlighted are those
2004 * surrounded by enough NONTENTs to make it impossible to give
2005 * them enough tents).
2006 *
2007 * However, this technique is incomplete: it is not a sufficient
2008 * condition for the existence of a perfect matching that every
2009 * connected component of the graph has the same number of tents
2010 * and trees. An example of a graph which satisfies the latter
2011 * condition but still has no perfect matching is
2012 *
2013 * A B C
2014 * | / ,/|
2015 * | / ,'/ |
2016 * | / ,' / |
2017 * |/,' / |
2018 * 1 2 3
2019 *
2020 * which can be realised in Tents as
2021 *
2022 * B
2023 * A 1 C 2
2024 * 3
2025 *
2026 * The matching-error highlighter described above will not mark
2027 * this construction as erroneous. However, something else will:
2028 * the three tents in the above diagram (let us suppose A,B,C
2029 * are the tents, though it doesn't matter which) contain two
2030 * diagonally adjacent pairs. So there will be _an_ error
2031 * highlighted for the above layout, even though not all types
2032 * of error will be highlighted.
2033 *
2034 * And in fact we can prove that this will always be the case:
2035 * that the shortcomings of the matching-error highlighter will
2036 * always be made up for by the easy tent adjacency highlighter.
2037 *
2038 * Lemma: Let G be a bipartite graph between n trees and n
2039 * tents, which is connected, and in which no tree has degree
2040 * more than two (but a tent may). Then G has a perfect matching.
2041 *
2042 * (Note: in the statement and proof of the Lemma I will
2043 * consistently use 'tree' to indicate a type of graph vertex as
2044 * opposed to a tent, and not to indicate a tree in the graph-
2045 * theoretic sense.)
2046 *
2047 * Proof:
2048 *
2049 * If we can find a tent of degree 1 joined to a tree of degree
2050 * 2, then any perfect matching must pair that tent with that
2051 * tree. Hence, we can remove both, leaving a smaller graph G'
2052 * which still satisfies all the conditions of the Lemma, and
2053 * which has a perfect matching iff G does.
2054 *
2055 * So, wlog, we may assume G contains no tent of degree 1 joined
2056 * to a tree of degree 2; if it does, we can reduce it as above.
2057 *
2058 * If G has no tent of degree 1 at all, then every tent has
2059 * degree at least two, so there are at least 2n edges in the
2060 * graph. But every tree has degree at most two, so there are at
2061 * most 2n edges. Hence there must be exactly 2n edges, so every
2062 * tree and every tent must have degree exactly two, which means
2063 * that the whole graph consists of a single loop (by
2064 * connectedness), and therefore certainly has a perfect
2065 * matching.
2066 *
2067 * Alternatively, if G does have a tent of degree 1 but it is
2068 * not connected to a tree of degree 2, then the tree it is
2069 * connected to must have degree 1 - and, by connectedness, that
2070 * must mean that that tent and that tree between them form the
2071 * entire graph. This trivial graph has a trivial perfect
2072 * matching. []
2073 *
2074 * That proves the lemma. Hence, in any case where the matching-
2075 * error highlighter fails to highlight an erroneous component
2076 * (because it has the same number of tents as trees, but they
2077 * cannot be matched up), the above lemma tells us that there
2078 * must be a tree with degree more than 2, i.e. a tree
2079 * orthogonally adjacent to at least three tents. But in that
2080 * case, there must be some pair of those three tents which are
2081 * diagonally adjacent to each other, so the tent-adjacency
2082 * highlighter will necessarily show an error. So any filled
2083 * layout in Tents which is not a correct solution to the puzzle
2084 * must have _some_ error highlighted by the subroutine below.
2085 *
2086 * (Of course it would be nicer if we could highlight all
2087 * errors: in the above example layout, we would like to
2088 * highlight tents A,B as having too few trees between them, and
2089 * trees 2,3 as having too few tents, in addition to marking the
2090 * adjacency problems. But I can't immediately think of any way
2091 * to find the smallest sets of such tents and trees without an
2092 * O(2^N) loop over all subsets of a given component.)
2093 */
2094
2095 /*
2096 * ret[0] through to ret[w*h-1] give error markers for the grid
2097 * squares. After that, ret[w*h] to ret[w*h+w-1] give error
2098 * markers for the column numbers, and ret[w*h+w] to
2099 * ret[w*h+w+h-1] for the row numbers.
2100 */
2101
2102 /*
2103 * Spot tent-adjacency violations.
2104 */
2105 for (x = 0; x < w*h; x++)
2106 ret[x] = 0;
2107 for (y = 0; y < h; y++) {
2108 for (x = 0; x < w; x++) {
2109 if (y+1 < h && x+1 < w &&
2110 ((grid[y*w+x] == TENT &&
2111 grid[(y+1)*w+(x+1)] == TENT) ||
2112 (grid[(y+1)*w+x] == TENT &&
2113 grid[y*w+(x+1)] == TENT))) {
2114 ret[y*w+x] |= 1 << ERR_ADJ_BOTRIGHT;
2115 ret[(y+1)*w+x] |= 1 << ERR_ADJ_TOPRIGHT;
2116 ret[y*w+(x+1)] |= 1 << ERR_ADJ_BOTLEFT;
2117 ret[(y+1)*w+(x+1)] |= 1 << ERR_ADJ_TOPLEFT;
2118 }
2119 if (y+1 < h &&
2120 grid[y*w+x] == TENT &&
2121 grid[(y+1)*w+x] == TENT) {
2122 ret[y*w+x] |= 1 << ERR_ADJ_BOT;
2123 ret[(y+1)*w+x] |= 1 << ERR_ADJ_TOP;
2124 }
2125 if (x+1 < w &&
2126 grid[y*w+x] == TENT &&
2127 grid[y*w+(x+1)] == TENT) {
2128 ret[y*w+x] |= 1 << ERR_ADJ_RIGHT;
2129 ret[y*w+(x+1)] |= 1 << ERR_ADJ_LEFT;
2130 }
2131 }
2132 }
2133
2134 /*
2135 * Spot numeric clue violations.
2136 */
2137 for (x = 0; x < w; x++) {
2138 int tents = 0, maybetents = 0;
2139 for (y = 0; y < h; y++) {
2140 if (grid[y*w+x] == TENT)
2141 tents++;
2142 else if (grid[y*w+x] == BLANK)
2143 maybetents++;
2144 }
2145 ret[w*h+x] = (tents > state->numbers->numbers[x] ||
2146 tents + maybetents < state->numbers->numbers[x]);
2147 }
2148 for (y = 0; y < h; y++) {
2149 int tents = 0, maybetents = 0;
2150 for (x = 0; x < w; x++) {
2151 if (grid[y*w+x] == TENT)
2152 tents++;
2153 else if (grid[y*w+x] == BLANK)
2154 maybetents++;
2155 }
2156 ret[w*h+w+y] = (tents > state->numbers->numbers[w+y] ||
2157 tents + maybetents < state->numbers->numbers[w+y]);
2158 }
2159
2160 /*
2161 * Identify groups of tents with too few trees between them,
2162 * which we do by constructing the connected components of the
2163 * bipartite adjacency graph between tents and trees
2164 * ('bipartite' in the sense that we deliberately ignore
2165 * adjacency between tents or between trees), and highlighting
2166 * all the tents in any component which has a smaller tree
2167 * count.
2168 */
2169 dsf_init(dsf, w*h);
2170 /* Construct the equivalence classes. */
2171 for (y = 0; y < h; y++) {
2172 for (x = 0; x < w-1; x++) {
2173 if ((grid[y*w+x] == TREE && grid[y*w+x+1] == TENT) ||
2174 (grid[y*w+x] == TENT && grid[y*w+x+1] == TREE))
2175 dsf_merge(dsf, y*w+x, y*w+x+1);
2176 }
2177 }
2178 for (y = 0; y < h-1; y++) {
2179 for (x = 0; x < w; x++) {
2180 if ((grid[y*w+x] == TREE && grid[(y+1)*w+x] == TENT) ||
2181 (grid[y*w+x] == TENT && grid[(y+1)*w+x] == TREE))
2182 dsf_merge(dsf, y*w+x, (y+1)*w+x);
2183 }
2184 }
2185 /* Count up the tent/tree difference in each one. */
2186 for (x = 0; x < w*h; x++)
2187 tmp[x] = 0;
2188 for (x = 0; x < w*h; x++) {
2189 y = dsf_canonify(dsf, x);
2190 if (grid[x] == TREE)
2191 tmp[y]++;
2192 else if (grid[x] == TENT)
2193 tmp[y]--;
2194 }
2195 /* And highlight any tent belonging to an equivalence class with
2196 * a score less than zero. */
2197 for (x = 0; x < w*h; x++) {
2198 y = dsf_canonify(dsf, x);
2199 if (grid[x] == TENT && tmp[y] < 0)
2200 ret[x] |= 1 << ERR_OVERCOMMITTED;
2201 }
2202
2203 /*
2204 * Identify groups of trees with too few tents between them.
2205 * This is done similarly, except that we now count BLANK as
2206 * equivalent to TENT, i.e. we only highlight such trees when
2207 * the user hasn't even left _room_ to provide tents for them
2208 * all. (Otherwise, we'd highlight all trees red right at the
2209 * start of the game, before the user had done anything wrong!)
2210 */
2211 #define TENT(x) ((x)==TENT || (x)==BLANK)
2212 dsf_init(dsf, w*h);
2213 /* Construct the equivalence classes. */
2214 for (y = 0; y < h; y++) {
2215 for (x = 0; x < w-1; x++) {
2216 if ((grid[y*w+x] == TREE && TENT(grid[y*w+x+1])) ||
2217 (TENT(grid[y*w+x]) && grid[y*w+x+1] == TREE))
2218 dsf_merge(dsf, y*w+x, y*w+x+1);
2219 }
2220 }
2221 for (y = 0; y < h-1; y++) {
2222 for (x = 0; x < w; x++) {
2223 if ((grid[y*w+x] == TREE && TENT(grid[(y+1)*w+x])) ||
2224 (TENT(grid[y*w+x]) && grid[(y+1)*w+x] == TREE))
2225 dsf_merge(dsf, y*w+x, (y+1)*w+x);
2226 }
2227 }
2228 /* Count up the tent/tree difference in each one. */
2229 for (x = 0; x < w*h; x++)
2230 tmp[x] = 0;
2231 for (x = 0; x < w*h; x++) {
2232 y = dsf_canonify(dsf, x);
2233 if (grid[x] == TREE)
2234 tmp[y]++;
2235 else if (TENT(grid[x]))
2236 tmp[y]--;
2237 }
2238 /* And highlight any tree belonging to an equivalence class with
2239 * a score more than zero. */
2240 for (x = 0; x < w*h; x++) {
2241 y = dsf_canonify(dsf, x);
2242 if (grid[x] == TREE && tmp[y] > 0)
2243 ret[x] |= 1 << ERR_OVERCOMMITTED;
2244 }
2245 #undef TENT
2246
2247 sfree(tmp);
2248 return ret;
2249 }
2250
2251 static void draw_err_adj(drawing *dr, game_drawstate *ds, int x, int y)
2252 {
2253 int coords[8];
2254 int yext, xext;
2255
2256 /*
2257 * Draw a diamond.
2258 */
2259 coords[0] = x - TILESIZE*2/5;
2260 coords[1] = y;
2261 coords[2] = x;
2262 coords[3] = y - TILESIZE*2/5;
2263 coords[4] = x + TILESIZE*2/5;
2264 coords[5] = y;
2265 coords[6] = x;
2266 coords[7] = y + TILESIZE*2/5;
2267 draw_polygon(dr, coords, 4, COL_ERROR, COL_GRID);
2268
2269 /*
2270 * Draw an exclamation mark in the diamond. This turns out to
2271 * look unpleasantly off-centre if done via draw_text, so I do
2272 * it by hand on the basis that exclamation marks aren't that
2273 * difficult to draw...
2274 */
2275 xext = TILESIZE/16;
2276 yext = TILESIZE*2/5 - (xext*2+2);
2277 draw_rect(dr, x-xext, y-yext, xext*2+1, yext*2+1 - (xext*3),
2278 COL_ERRTEXT);
2279 draw_rect(dr, x-xext, y+yext-xext*2+1, xext*2+1, xext*2, COL_ERRTEXT);
2280 }
2281
2282 static void draw_tile(drawing *dr, game_drawstate *ds,
2283 int x, int y, int v, int cur, int printing)
2284 {
2285 int err;
2286 int tx = COORD(x), ty = COORD(y);
2287 int cx = tx + TILESIZE/2, cy = ty + TILESIZE/2;
2288
2289 err = v & ~15;
2290 v &= 15;
2291
2292 clip(dr, tx, ty, TILESIZE, TILESIZE);
2293
2294 if (!printing) {
2295 draw_rect(dr, tx, ty, TILESIZE, TILESIZE, COL_GRID);
2296 draw_rect(dr, tx+1, ty+1, TILESIZE-1, TILESIZE-1,
2297 (v == BLANK ? COL_BACKGROUND : COL_GRASS));
2298 }
2299
2300 if (v == TREE) {
2301 int i;
2302
2303 (printing ? draw_rect_outline : draw_rect)
2304 (dr, cx-TILESIZE/15, ty+TILESIZE*3/10,
2305 2*(TILESIZE/15)+1, (TILESIZE*9/10 - TILESIZE*3/10),
2306 (err & (1<<ERR_OVERCOMMITTED) ? COL_ERRTRUNK : COL_TREETRUNK));
2307
2308 for (i = 0; i < (printing ? 2 : 1); i++) {
2309 int col = (i == 1 ? COL_BACKGROUND :
2310 (err & (1<<ERR_OVERCOMMITTED) ? COL_ERROR :
2311 COL_TREELEAF));
2312 int sub = i * (TILESIZE/32);
2313 draw_circle(dr, cx, ty+TILESIZE*4/10, TILESIZE/4 - sub,
2314 col, col);
2315 draw_circle(dr, cx+TILESIZE/5, ty+TILESIZE/4, TILESIZE/8 - sub,
2316 col, col);
2317 draw_circle(dr, cx-TILESIZE/5, ty+TILESIZE/4, TILESIZE/8 - sub,
2318 col, col);
2319 draw_circle(dr, cx+TILESIZE/4, ty+TILESIZE*6/13, TILESIZE/8 - sub,
2320 col, col);
2321 draw_circle(dr, cx-TILESIZE/4, ty+TILESIZE*6/13, TILESIZE/8 - sub,
2322 col, col);
2323 }
2324 } else if (v == TENT) {
2325 int coords[6];
2326 int col;
2327 coords[0] = cx - TILESIZE/3;
2328 coords[1] = cy + TILESIZE/3;
2329 coords[2] = cx + TILESIZE/3;
2330 coords[3] = cy + TILESIZE/3;
2331 coords[4] = cx;
2332 coords[5] = cy - TILESIZE/3;
2333 col = (err & (1<<ERR_OVERCOMMITTED) ? COL_ERROR : COL_TENT);
2334 draw_polygon(dr, coords, 3, (printing ? -1 : col), col);
2335 }
2336
2337 if (err & (1 << ERR_ADJ_TOPLEFT))
2338 draw_err_adj(dr, ds, tx, ty);
2339 if (err & (1 << ERR_ADJ_TOP))
2340 draw_err_adj(dr, ds, tx+TILESIZE/2, ty);
2341 if (err & (1 << ERR_ADJ_TOPRIGHT))
2342 draw_err_adj(dr, ds, tx+TILESIZE, ty);
2343 if (err & (1 << ERR_ADJ_LEFT))
2344 draw_err_adj(dr, ds, tx, ty+TILESIZE/2);
2345 if (err & (1 << ERR_ADJ_RIGHT))
2346 draw_err_adj(dr, ds, tx+TILESIZE, ty+TILESIZE/2);
2347 if (err & (1 << ERR_ADJ_BOTLEFT))
2348 draw_err_adj(dr, ds, tx, ty+TILESIZE);
2349 if (err & (1 << ERR_ADJ_BOT))
2350 draw_err_adj(dr, ds, tx+TILESIZE/2, ty+TILESIZE);
2351 if (err & (1 << ERR_ADJ_BOTRIGHT))
2352 draw_err_adj(dr, ds, tx+TILESIZE, ty+TILESIZE);
2353
2354 if (cur) {
2355 int coff = TILESIZE/8;
2356 draw_rect_outline(dr, tx + coff, ty + coff,
2357 TILESIZE - coff*2 + 1, TILESIZE - coff*2 + 1,
2358 COL_GRID);
2359 }
2360
2361 unclip(dr);
2362 draw_update(dr, tx+1, ty+1, TILESIZE-1, TILESIZE-1);
2363 }
2364
2365 /*
2366 * Internal redraw function, used for printing as well as drawing.
2367 */
2368 static void int_redraw(drawing *dr, game_drawstate *ds, game_state *oldstate,
2369 game_state *state, int dir, game_ui *ui,
2370 float animtime, float flashtime, int printing)
2371 {
2372 int w = state->p.w, h = state->p.h;
2373 int x, y, flashing;
2374 int cx = -1, cy = -1;
2375 int cmoved = 0;
2376 char *tmpgrid;
2377 int *errors;
2378
2379 if (ui) {
2380 if (ui->cdisp) { cx = ui->cx; cy = ui->cy; }
2381 if (cx != ds->cx || cy != ds->cy) cmoved = 1;
2382 }
2383
2384 if (printing || !ds->started) {
2385 if (!printing) {
2386 int ww, wh;
2387 game_compute_size(&state->p, TILESIZE, &ww, &wh);
2388 draw_rect(dr, 0, 0, ww, wh, COL_BACKGROUND);
2389 draw_update(dr, 0, 0, ww, wh);
2390 ds->started = TRUE;
2391 }
2392
2393 if (printing)
2394 print_line_width(dr, TILESIZE/64);
2395
2396 /*
2397 * Draw the grid.
2398 */
2399 for (y = 0; y <= h; y++)
2400 draw_line(dr, COORD(0), COORD(y), COORD(w), COORD(y), COL_GRID);
2401 for (x = 0; x <= w; x++)
2402 draw_line(dr, COORD(x), COORD(0), COORD(x), COORD(h), COL_GRID);
2403 }
2404
2405 if (flashtime > 0)
2406 flashing = (int)(flashtime * 3 / FLASH_TIME) != 1;
2407 else
2408 flashing = FALSE;
2409
2410 /*
2411 * Find errors. For this we use _part_ of the information from a
2412 * currently active drag: we transform dsx,dsy but not anything
2413 * else. (This seems to strike a good compromise between having
2414 * the error highlights respond instantly to single clicks, but
2415 * not giving constant feedback during a right-drag.)
2416 */
2417 if (ui && ui->drag_button >= 0) {
2418 tmpgrid = snewn(w*h, char);
2419 memcpy(tmpgrid, state->grid, w*h);
2420 tmpgrid[ui->dsy * w + ui->dsx] =
2421 drag_xform(ui, ui->dsx, ui->dsy, tmpgrid[ui->dsy * w + ui->dsx]);
2422 errors = find_errors(state, tmpgrid);
2423 sfree(tmpgrid);
2424 } else {
2425 errors = find_errors(state, state->grid);
2426 }
2427
2428 /*
2429 * Draw the grid.
2430 */
2431 for (y = 0; y < h; y++) {
2432 for (x = 0; x < w; x++) {
2433 int v = state->grid[y*w+x];
2434 int credraw = 0;
2435
2436 /*
2437 * We deliberately do not take drag_ok into account
2438 * here, because user feedback suggests that it's
2439 * marginally nicer not to have the drag effects
2440 * flickering on and off disconcertingly.
2441 */
2442 if (ui && ui->drag_button >= 0)
2443 v = drag_xform(ui, x, y, v);
2444
2445 if (flashing && (v == TREE || v == TENT))
2446 v = NONTENT;
2447
2448 if (cmoved) {
2449 if ((x == cx && y == cy) ||
2450 (x == ds->cx && y == ds->cy)) credraw = 1;
2451 }
2452
2453 v |= errors[y*w+x];
2454
2455 if (printing || ds->drawn[y*w+x] != v || credraw) {
2456 draw_tile(dr, ds, x, y, v, (x == cx && y == cy), printing);
2457 if (!printing)
2458 ds->drawn[y*w+x] = v;
2459 }
2460 }
2461 }
2462
2463 /*
2464 * Draw (or redraw, if their error-highlighted state has
2465 * changed) the numbers.
2466 */
2467 for (x = 0; x < w; x++) {
2468 if (printing || ds->numbersdrawn[x] != errors[w*h+x]) {
2469 char buf[80];
2470 draw_rect(dr, COORD(x), COORD(h)+1, TILESIZE, BRBORDER-1,
2471 COL_BACKGROUND);
2472 sprintf(buf, "%d", state->numbers->numbers[x]);
2473 draw_text(dr, COORD(x) + TILESIZE/2, COORD(h+1),
2474 FONT_VARIABLE, TILESIZE/2, ALIGN_HCENTRE|ALIGN_VNORMAL,
2475 (errors[w*h+x] ? COL_ERROR : COL_GRID), buf);
2476 draw_update(dr, COORD(x), COORD(h)+1, TILESIZE, BRBORDER-1);
2477 if (!printing)
2478 ds->numbersdrawn[x] = errors[w*h+x];
2479 }
2480 }
2481 for (y = 0; y < h; y++) {
2482 if (printing || ds->numbersdrawn[w+y] != errors[w*h+w+y]) {
2483 char buf[80];
2484 draw_rect(dr, COORD(w)+1, COORD(y), BRBORDER-1, TILESIZE,
2485 COL_BACKGROUND);
2486 sprintf(buf, "%d", state->numbers->numbers[w+y]);
2487 draw_text(dr, COORD(w+1), COORD(y) + TILESIZE/2,
2488 FONT_VARIABLE, TILESIZE/2, ALIGN_HRIGHT|ALIGN_VCENTRE,
2489 (errors[w*h+w+y] ? COL_ERROR : COL_GRID), buf);
2490 draw_update(dr, COORD(w)+1, COORD(y), BRBORDER-1, TILESIZE);
2491 if (!printing)
2492 ds->numbersdrawn[w+y] = errors[w*h+w+y];
2493 }
2494 }
2495
2496 if (cmoved) {
2497 ds->cx = cx;
2498 ds->cy = cy;
2499 }
2500
2501 sfree(errors);
2502 }
2503
2504 static void game_redraw(drawing *dr, game_drawstate *ds, game_state *oldstate,
2505 game_state *state, int dir, game_ui *ui,
2506 float animtime, float flashtime)
2507 {
2508 int_redraw(dr, ds, oldstate, state, dir, ui, animtime, flashtime, FALSE);
2509 }
2510
2511 static float game_anim_length(game_state *oldstate, game_state *newstate,
2512 int dir, game_ui *ui)
2513 {
2514 return 0.0F;
2515 }
2516
2517 static float game_flash_length(game_state *oldstate, game_state *newstate,
2518 int dir, game_ui *ui)
2519 {
2520 if (!oldstate->completed && newstate->completed &&
2521 !oldstate->used_solve && !newstate->used_solve)
2522 return FLASH_TIME;
2523
2524 return 0.0F;
2525 }
2526
2527 static int game_is_solved(game_state *state)
2528 {
2529 return state->completed;
2530 }
2531
2532 static int game_timing_state(game_state *state, game_ui *ui)
2533 {
2534 return TRUE;
2535 }
2536
2537 static void game_print_size(game_params *params, float *x, float *y)
2538 {
2539 int pw, ph;
2540
2541 /*
2542 * I'll use 6mm squares by default.
2543 */
2544 game_compute_size(params, 600, &pw, &ph);
2545 *x = pw / 100.0F;
2546 *y = ph / 100.0F;
2547 }
2548
2549 static void game_print(drawing *dr, game_state *state, int tilesize)
2550 {
2551 int c;
2552
2553 /* Ick: fake up `ds->tilesize' for macro expansion purposes */
2554 game_drawstate ads, *ds = &ads;
2555 game_set_size(dr, ds, NULL, tilesize);
2556
2557 c = print_mono_colour(dr, 1); assert(c == COL_BACKGROUND);
2558 c = print_mono_colour(dr, 0); assert(c == COL_GRID);
2559 c = print_mono_colour(dr, 1); assert(c == COL_GRASS);
2560 c = print_mono_colour(dr, 0); assert(c == COL_TREETRUNK);
2561 c = print_mono_colour(dr, 0); assert(c == COL_TREELEAF);
2562 c = print_mono_colour(dr, 0); assert(c == COL_TENT);
2563
2564 int_redraw(dr, ds, NULL, state, +1, NULL, 0.0F, 0.0F, TRUE);
2565 }
2566
2567 #ifdef COMBINED
2568 #define thegame tents
2569 #endif
2570
2571 const struct game thegame = {
2572 "Tents", "games.tents", "tents",
2573 default_params,
2574 game_fetch_preset,
2575 decode_params,
2576 encode_params,
2577 free_params,
2578 dup_params,
2579 TRUE, game_configure, custom_params,
2580 validate_params,
2581 new_game_desc,
2582 validate_desc,
2583 new_game,
2584 dup_game,
2585 free_game,
2586 TRUE, solve_game,
2587 FALSE, game_can_format_as_text_now, game_text_format,
2588 new_ui,
2589 free_ui,
2590 encode_ui,
2591 decode_ui,
2592 game_changed_state,
2593 interpret_move,
2594 execute_move,
2595 PREFERRED_TILESIZE, game_compute_size, game_set_size,
2596 game_colours,
2597 game_new_drawstate,
2598 game_free_drawstate,
2599 game_redraw,
2600 game_anim_length,
2601 game_flash_length,
2602 game_is_solved,
2603 TRUE, FALSE, game_print_size, game_print,
2604 FALSE, /* wants_statusbar */
2605 FALSE, game_timing_state,
2606 REQUIRE_RBUTTON, /* flags */
2607 };
2608
2609 #ifdef STANDALONE_SOLVER
2610
2611 #include <stdarg.h>
2612
2613 int main(int argc, char **argv)
2614 {
2615 game_params *p;
2616 game_state *s, *s2;
2617 char *id = NULL, *desc, *err;
2618 int grade = FALSE;
2619 int ret, diff, really_verbose = FALSE;
2620 struct solver_scratch *sc;
2621
2622 while (--argc > 0) {
2623 char *p = *++argv;
2624 if (!strcmp(p, "-v")) {
2625 really_verbose = TRUE;
2626 } else if (!strcmp(p, "-g")) {
2627 grade = TRUE;
2628 } else if (*p == '-') {
2629 fprintf(stderr, "%s: unrecognised option `%s'\n", argv[0], p);
2630 return 1;
2631 } else {
2632 id = p;
2633 }
2634 }
2635
2636 if (!id) {
2637 fprintf(stderr, "usage: %s [-g | -v] <game_id>\n", argv[0]);
2638 return 1;
2639 }
2640
2641 desc = strchr(id, ':');
2642 if (!desc) {
2643 fprintf(stderr, "%s: game id expects a colon in it\n", argv[0]);
2644 return 1;
2645 }
2646 *desc++ = '\0';
2647
2648 p = default_params();
2649 decode_params(p, id);
2650 err = validate_desc(p, desc);
2651 if (err) {
2652 fprintf(stderr, "%s: %s\n", argv[0], err);
2653 return 1;
2654 }
2655 s = new_game(NULL, p, desc);
2656 s2 = new_game(NULL, p, desc);
2657
2658 sc = new_scratch(p->w, p->h);
2659
2660 /*
2661 * When solving an Easy puzzle, we don't want to bother the
2662 * user with Hard-level deductions. For this reason, we grade
2663 * the puzzle internally before doing anything else.
2664 */
2665 ret = -1; /* placate optimiser */
2666 for (diff = 0; diff < DIFFCOUNT; diff++) {
2667 ret = tents_solve(p->w, p->h, s->grid, s->numbers->numbers,
2668 s2->grid, sc, diff);
2669 if (ret < 2)
2670 break;
2671 }
2672
2673 if (diff == DIFFCOUNT) {
2674 if (grade)
2675 printf("Difficulty rating: too hard to solve internally\n");
2676 else
2677 printf("Unable to find a unique solution\n");
2678 } else {
2679 if (grade) {
2680 if (ret == 0)
2681 printf("Difficulty rating: impossible (no solution exists)\n");
2682 else if (ret == 1)
2683 printf("Difficulty rating: %s\n", tents_diffnames[diff]);
2684 } else {
2685 verbose = really_verbose;
2686 ret = tents_solve(p->w, p->h, s->grid, s->numbers->numbers,
2687 s2->grid, sc, diff);
2688 if (ret == 0)
2689 printf("Puzzle is inconsistent\n");
2690 else
2691 fputs(game_text_format(s2), stdout);
2692 }
2693 }
2694
2695 return 0;
2696 }
2697
2698 #endif
2699
2700 /* vim: set shiftwidth=4 tabstop=8: */