# tento program nacita zo vstupu popis sudoku a vygeneruje ILP popisujuci jeho riesenie
import sys

# vsade pouzivame cisla 1-9, oplati sa na ne mat konstantu
CISLA = list(range(1,10))

# pomocne funkcie pre nazov premennej a sucet vyrazov 
def premenna(r, c, v): return f'x{r}{c}{v}'
def sucet(scitance): return ' + '.join(scitance)

# vypiseme ciel, na ktorom nam nezalezi ale v programe musi byt
print('max: 0;')

# zacneme vseobecnymi pravidlami:
# na kazdom policku je prave jedno cislo
for r in CISLA:
    for c in CISLA:
        moznosti = [ premenna(r,c,v) for v in CISLA ]
        print( f'{ sucet(moznosti) } = 1;' )

# v kazdom riadku sa nachadza kazde cislo
for r in CISLA:
    for v in CISLA:
        moznosti = [ premenna(r,c,v) for c in CISLA ]
        print( f'{ sucet(moznosti) } = 1;' )

# v kazdom stlpci sa nachadza kazde cislo
for c in CISLA:
    for v in CISLA:
        moznosti = [ premenna(r,c,v) for r in CISLA ]
        print( f'{ sucet(moznosti) } = 1;' )

# v kazdom velkom 3x3 stvorci sa nachadza kazde cislo
for br in range(3):
    for bc in range(3):
        for v in CISLA:
            moznosti = [ premenna(3*br+r,3*bc+c,v) for r in [1,2,3] for c in [1,2,3] ]
            print( f'{ sucet(moznosti) } = 1;' )

# teraz nacitame samotne sudoku a pridame podmienky zodpovedajuce predpisanym cislam
sudoku = [ line.split() for line in sys.stdin.readlines() ]
fixed = []
for r in CISLA:
    for c in CISLA:
        policko = sudoku[r-1][c-1]
        if policko.isdigit():
            v = int(policko)
            print( f'{ premenna(r,c,v) } = 1;')
            fixed.append( premenna(r,c,v) )

# premenne, ktorym sme prave nastavili hodnotu na 1, uz lp_solve berie ako konstanty
# o ostatnych mu este musime povedat, ze su binarne
other = [ premenna(r,c,v) for r in CISLA for c in CISLA for v in CISLA if premenna(r,c,v) not in fixed ]
print('bin ' + ', '.join(other) + ';')

