Pythonで数独
Pythonで数独。
定式化して解くのに、入出力合わせて15行だ。
from pulp import * m = LpProblem() v = [[[LpVariable('v%d%d%d' % (i, j, k), cat = LpBinary) for k in range(9)] for j in range(9)] for i in range(9)] with open('pulp-sudoku.txt') as fp: for i, j in [(i0, j0) for i0 in range(9) for j0 in range(9)]: if j == 0: s = fp.readline() if s[j].isdigit(): m += v[i][j][int(s[j]) - 1] == 1 m += lpSum(v[i][j]) == 1 m += lpSum(v[i][k][j] for k in range(9)) == 1 m += lpSum(v[k][i][j] for k in range(9)) == 1 m += lpSum(v[i / 3 * 3 + i1][i % 3 * 3 + j1][j] for i1 in range(3) for j1 in range(3)) == 1 m.solve() for i in range(9): for j in range(9): print int(1 + sum([k * value(v[i][j][k]) for k in range(9)])), print