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)