X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=pattern.c;h=e5f958abb817a600f10b1f9985ca2fd095380b7c;hb=db313b3948d27244dd7c34c2609c66d6204d8931;hp=9a74e553186bb1b35c3f3f5ac476107423879c08;hpb=a7dc17c4258837b0ee3927f1db5e1c02acee5cc3;p=sgt-puzzles.git diff --git a/pattern.c b/pattern.c index 9a74e55..e5f958a 100644 --- a/pattern.c +++ b/pattern.c @@ -308,7 +308,18 @@ static void generate(random_state *rs, int w, int h, unsigned char *retgrid) fgrid2 = snewn(w*h, float); memcpy(fgrid2, fgrid, w*h*sizeof(float)); qsort(fgrid2, w*h, sizeof(float), float_compare); - threshold = fgrid2[w*h/2]; + /* Choose a threshold that makes half the pixels black. In case of + * an odd number of pixels, select randomly between just under and + * just over half. */ + { + int index = w * h / 2; + if (w & h & 1) + index += random_upto(rs, 2); + if (index < w*h) + threshold = fgrid2[index]; + else + threshold = fgrid2[w*h-1] + 1; + } sfree(fgrid2); for (i = 0; i < h; i++) { @@ -446,6 +457,8 @@ static int do_row(unsigned char *known, unsigned char *deduced, if (rowlen == 0) { memset(deduced, DOT, len); + } else if (rowlen == 1 && data[0] == len) { + memset(deduced, BLOCK, len); } else { do_recurse(known, deduced, row, minpos_done, maxpos_done, minpos_ok, maxpos_ok, data, len, freespace, 0, 0);