Skip to content

Combining Rows and Columns

Unlock the full power of nonogram logic by working in both directions simultaneously. Information flows through intersections, creating a cascade of deductions.

The Core Insight

Every cell in a nonogram exists at the intersection of exactly one row and one column. This means every cell must satisfy two sets of constraints: the row clues and the column clues.

When you mark a cell as filled (or empty) based on row analysis, that information immediately becomes a constraint for the intersecting column—and vice versa. This creates a feedback loop:

Row analysis → fills cell → updates column
Column analysis → uses new fill → finds more cells
New fills → updates rows → cycle continues

Expert solvers don't think in terms of "solving rows, then columns." They think in terms of propagating constraints through the grid in both directions continuously.

The Basic Pattern: Fill → Check → Repeat

Here's the fundamental workflow for combining directions:

  1. Make progress in one direction

    Use overlap/crosses to mark cells in a row (or column).

  2. Immediately check intersecting lines

    For each newly marked cell, analyze the intersecting column (or row) to see if it now has new forced cells.

  3. Propagate new information back

    Any cells found in step 2 become constraints for their intersecting lines. Check those lines too.

  4. Repeat until stuck

    Continue this cycle until no more progress can be made with current techniques.

This is why you should never fully solve all rows before looking at columns, or vice versa. You'll miss opportunities for propagation and waste time.

Example 1: Single Cell Cascade

Let's see how marking a single cell can cascade through the grid. Starting with a small 5×5 section:

Initial state:

2 1 3 1 2 ───────── 3 · · · · · 1 · · · · · 4 · · · · · 1 · · · · · 2 · · · · ·

Step 1: Row 3 has clue "4" in 5 cells

Using overlap, we find 3 forced cells (positions 2-4).

2 1 3 1 2 ───────── 3 · · · · · 1 · · · · · 4 · ■ ■ ■ · ← Forced cells from overlap 1 · · · · · 2 · · · · ·

Step 2: Check column 3 (clue: "3")

Column 3 needs exactly 3 filled cells. We already have 1 from row 3. Where are the other 2? Using overlap within this column (5 cells, need 3), we find 1 forced cell. But wait—which one?

Let's say the forced cell from column overlap is at row 3 (which we already have). Now check rows 1, 2, 4, 5 to see which could contribute the remaining 2 cells for the column's "3" group.

Step 3: Check column 2 (clue: "1")

Column 2 needs exactly 1 filled cell total. We already have it at row 3. This means all other cells in column 2 must be empty!

2 1 3 1 2 ───────── 3 · × · · · 1 · × · · · 4 · ■ ■ ■ · 1 · × · · · 2 · × · · ·

Column 2 is now complete. Mark all non-filled cells as empty.

Step 4: Update rows with new empties

Each row now has a new constraint (the cross in column 2). Re-analyze each row:

  • Row 1 (clue: "3"): Group can't start at column 2 (crossed). Apply overlap with this constraint.

  • Row 2 (clue: "1"): Similar analysis.

Key takeaway: Filling 3 cells in one row led to completing an entire column, which then provided new constraints for 4 other rows. This cascade happened because we checked intersecting lines immediately after each change.

Example 2: Resolving Ambiguity

Sometimes a single direction gives ambiguous results, but combining directions resolves the ambiguity.

Row 5, clue "2 2":

· · · · · · · · ·

Without more info, multiple arrangements are possible

But check the columns:

Column 2: already has all its required filled cells. Must be empty at row 5.

Column 7: similarly complete. Must be empty at row 5.

· × · · · · × · ·

Now we have crosses from column constraints

Re-analyze the row with these crosses:

The row is divided into segments: [1], [3-6], [8-9]. The two groups of "2" must fit in segments [3-6] and [8-9]. Segment [3-6] has 4 cells, and segment [8-9] has 2 cells.

× × · ■ ■ × × ■ ■

Apply overlap within each segment to find forced cells. The ambiguity is resolved!

The Scan Pattern: Rows → Columns → Rows

A practical workflow for mid-puzzle solving:

  1. Scan all rows top to bottom. For each row, apply overlap and crosses. Mark any new cells.

  2. Scan all columns left to right. For each column, apply the same techniques. Mark new cells.

  3. Repeat until a full pass (rows + columns) yields no new cells.

Each pass gets easier because previous passes have added constraints. A row that was ambiguous in pass 1 might be fully determined in pass 2 thanks to column-derived crosses.

Pro tip: Don't skip lines that seem "done." Sometimes a small change elsewhere makes a previously-analyzed line suddenly solvable.

Advanced: Constraint Propagation Depth

When you mark a cell, you can propagate the constraint multiple steps:

Depth 1:

Mark cell → check intersecting line → stop

Depth 2:

Mark cell → check intersecting line → if new cells found, check their intersecting lines → stop

Depth ∞:

Continue propagating until no new cells are found anywhere

Beginners typically use depth 1. Intermediate solvers use depth 2. Experts use depth ∞—they automatically propagate every change through the entire grid before moving on.

Common Mistakes to Avoid

❌ Solving all rows before touching columns

This linear approach misses most propagation opportunities. You'll stall quickly and think the puzzle needs guessing.

❌ Marking cells but not checking intersections

If you fill a cell in a row and don't immediately check the column, you're throwing away information.

❌ Forgetting that empties propagate too

When you mark a cell empty in a row, that empty also constrains the column. Propagate crosses just like fills.

Why This Technique Is Essential

Without combining directions, you'd need to guess. The constraints from a single direction are often insufficient to uniquely determine cells. But when you combine both directions, the constraints multiply:

  • Row constraints alone: ambiguous

  • Column constraints alone: ambiguous

  • Both together: unique solution

This is the essence of nonogram logic. You're not solving rows. You're not solving columns. You're solving intersections.

Continue Learning