Mots croisés

Bravo!

Aides

La seule grande difficulté était de détecter les segments dans la grille.

var = {}

for i in rows:
    for j in cols:
        if grid[i][j] == EMPTY:
            var[i, j, 0] = set(alphabet)
        elif grid[i][j] in alphabet:
            var[i, j, 0] = {grid[i][j]}     # force initially filled cell

for i in rows:
    start = -1
    for j in cols:
        if grid[i][j] != BORDER:
            if start == -1:
                start = j
        else:
            if start != -1:
                l = j - start
                if l >= 2:
                    var[i, start, +l] = set(words[l])
                start = -1

for j in cols:
    start = -1
    for i in rows:
        if grid[i][j] != BORDER:
            if start == -1:
                start = i
        else:
            if start != -1:
                l = i - start
                if l >= 2:
                    var[start, j, -l] = set(words[l])
                start = -1


# create a constraint program
P = constraint_program(var)

# and generate the constraints
for (i, j, l) in var:
    if l > 0:
        for pos in range(l):
            P.add_constraint((i, j, l), (i, j + pos, 0), relation[l, pos])
    elif l < 0:
        for pos in range(-l):
            P.add_constraint((i, j, l), (i + pos, j, 0), relation[-l, pos])

P.set_arc_consistency()  # optional

ans = 0
for sol in P.solve_all():
    ans += 1
    if ans == 1:
        for (i, j, l) in sol:
            if l == 0:
                grid[i][j] = sol[i, j, l]
        for line in grid:
            print(" ".join(line))
    else:
        print(ans)

suite