■
- import sys
sys.setrecursionlimit(10**7)
input_grid = [[0, 0, 8, 7, 0, 0, 0, 1, 0],
[0, 5, 0, 0, 0, 3, 0, 0, 0],
[0, 0, 0, 2, 4, 8, 0, 0, 0],
[0, 9, 0, 0, 0, 0, 0, 2, 4],
[0, 3, 6, 0, 0, 0, 0, 0, 1],
[4, 0, 0, 0, 0, 0, 5, 0, 0],
[0, 0, 0, 3, 8, 7, 0, 0, 0],
[0, 0, 0, 9, 0, 0, 0, 0, 2],
[0, 0, 7, 0, 0, 6, 0, 5, 0]]
def find_next_cell(grid):
for y in range(9):
for x in range(9):
if grid[y][x] == 0:
# 埋まっていない座標を返す
return y, x
# すべてのマスに数字が入っている状態
return -1, -1
# 条件を満たすかの判定
def is_valid(grid, y, x, value):
# 横のチェック
is_row = value not in grid[y]
# 縦のチェック
is_column = value not in [i[x] for i in grid]
# ブロックを取り出す
blk_x, blk_y = (x//3) * 3, (y//3) * 3
blk_grid = [i[blk_x:blk_x + 3] for i in input_grid[blk_y:blk_y + 3]]
# ブロックのチェック
is_block = value not in sum(blk_grid, )
# 有効チェック
return all([is_row, is_column, is_block])
# すべてのマスを調べて数字が最大で何個入りそうなのかを確認する
def possibility(grid, y, x):
# インデックス番号
idx = 0
# 今考えているマスにどれだけの数字が入りそうなのか
mass2 =
# 今考えているマスに
number2 =
tmp =
if grid[y][x] != 0:
return True
else:
cnt = 0
for value in range(1, 10):
# もし今考えている数字が入りそうなら
if is_valid(grid, y, x, value):
# 最大で入る可能性数を足す
cnt += 1
tmp.append(value)
# そのマスには cnt の数だけ入りそう
mass2.append([cnt, y, x])
number2.append(tmp)
return *mass2, *number2
mass=
number=
mass_num=[]
for i in range(9):
for j in range(9):
if possibility(input_grid, j, i) != True:
mass.append(possibility(input_grid, j, i)[0])
number.append(possibility(input_grid, j, i)[1])
for i in range(len(mass)):
mass_num.append([mass[i], number[i]])
mass_num.sort()
y = mass_num[0][0][1]
x = mass_num[0][0][2]
idx = 0
#print(mass_num[0][0][3]) インデックス番号は 0 0 3 だ!()
# 実際に数字を再帰的に入れてみる
def solve_sudoku(grid, idx):
#[print(i) for i in input_grid]
Y, X = find_next_cell(grid)
if Y == X == -1:
return True
for value in mass_num[idx][1]:
if is_valid(grid, mass_num[idx][0][1], mass_num[idx][0][2], value):
grid[mass_num[idx][0][1]][mass_num[idx][0][2]] = value
# 次へ
idx += 1
if solve_sudoku(grid, idx):
return True
grid[mass_num[idx][0][1]][mass_num[idx][0][2]] = 0
idx -= 1
return False
print(solve_sudoku(input_grid, idx))
[print(i) for i in input_grid]