ナンプレ(1)

数独とかナンプレとか言っているものをやっていると、自動で解きたくなる。あれは、いかに早く気づくかという話で、どうも苦手。


例えば、3つのまだ埋まっていないマスがあって、それぞれ、1と2、2と3、1と3が入る可能性があるとする。また、3つのマスには同じ数字が入ってはいけない。そのマスには入る数字の組合せは?


要するに、すべての順列に対して妥当かどうかを検証すればよい。


def perm(l):
if len(l) > 1:
for i in range(len(l)):
for e in perm(l[:i] + l[i+1:]):
yield l[i:i+1] + e
else:
yield l

def isValid(e):
for i in range(len(A)):
if A[i].count(e[i]) == 0:
return False
return True

A = [ [ 1, 2 ], [ 2, 3 ], [ 3, 1 ] ];

l = [ 1, 2, 3 ]
for e in perm(l):
if isValid(e):
print e

順列は再帰で発生させている。とても効率が悪そう。