Nurikabe
Paint every cell sea (black) or island (white). Each island is one connected white block holding exactly one number — its size. Islands never touch side-to-side, the sea is one connected sheet, and it holds no 2×2 block of black. Click a cell to cycle sea → island-mark → clear.
The solver keeps a three-valued cell — unknown, white, or black — and runs a sound propagation pass to a fixpoint before it ever guesses. Four rules feed each other: the pool rule (three blacks in a 2×2 force the fourth white), the sealed island (a white region the size of its clue blacks every neighbour), the merge / over-size check (two clues in one region, or a region past its number, is a dead end), and the key one — a reachability flood that expands every clue outward through unknown cells within its remaining budget and blacks out any cell no clue can still reach. The flood is deliberately generous, so that deduction is always safe. When logic stalls, a fewest-options search branches on one cell, re-propagates, and counts solutions — every bundled board is drawn as its own finished sea, and the test suite asserts the solver re-derives exactly one answer.