a="003020600900305001001806400008102900700000008006708200002609500800203009005010300"
b=[]
def same_row(i,j): return (i/9 == j/9)
def same_col(i,j): return (i-j) % 9 == 0
def same_block(i,j): return (i/27 == j/27 and i%9/3 == j%9/3)
def r(a):
i = a.find('0')
if i == -1:
b.append(a)
return a
excluded_numbers = set()
for j in range(81):
if same_row(i,j) or same_col(i,j) or same_block(i,j):
excluded_numbers.add(a[j])
for m in '123456789':
if m not in excluded_numbers:
return r(a[:i]+m+a[i+1:])
print r(a),b
これは数独ソルバーです。0 と 1 ~ 9 の数字を含む 81 サイズの文字列を入力し、0 を除いた文字列を返します。与えられた例は文字列を入力しa
、結果の文字列を返すことになっています。関数が結果を返すことを確認するには、とexit(a)
の代わりreturn a
にb.append(a)
再帰関数によって返された結果を出力しようとすると、r
何も返されません。b
また、テーブルを埋めるという事実にもかかわらずb.append(a)
、空のテーブルが出力されます。