今回は数独をプログラムで解いてみます。
解説動画はこちら
さて数独のルールですが
9x9のマスがあり初期配置で数値が置かれている。
空いているマスに1〜9のいずれかの数字を入れる。
縦・横の各列及び
太線で囲まれた3×3のブロック内に
同じ数字が複数入ってはいけない。
コレをプログラムで解いていきましょう。
考え方としては
こんな感じです。
プログラムの実装を考えてみましょう。
考えたく無い方はこちらが
実装例になります。
一応この実装では
9x9以上の数独にも対応してますが
16x16以上は時間がかかるので
試してませんwww
数独は色々な実装を考えることができ
解き方は1つでは無いかと思います。
もっと効率の良い
実装をすれば16x16の数独なども
素早く解けるのでは無いかと思います。
こういったパズルゲームを
解くのは面白いですよね
今日はコレまでです
それでは。
解説動画はこちら
さて数独のルールですが
9x9のマスがあり初期配置で数値が置かれている。
空いているマスに1〜9のいずれかの数字を入れる。
縦・横の各列及び
太線で囲まれた3×3のブロック内に
同じ数字が複数入ってはいけない。

コレをプログラムで解いていきましょう。
考え方としては
事前:用意された数値埋めて
空白マスを0として埋めたリスト型を用意する
空白マスを0として埋めたリスト型を用意する
(1) 左上から右下へと順に0を調べていく
(2) 0があれば、その時点で配置可能な数字を調べる
(3) 配置可能な数字を仮に配置して、次のマスを調べていく
(4) もし配置がうまくいかなければ(3)に戻る
(5) 最後のマスに到達するまで、(2)以降の処理を繰り返す
(6) 最後に到達したら結果を出力する
こんな感じです。
プログラムの実装を考えてみましょう。
考えたく無い方はこちらが
実装例になります。
# 行、列、ブロックのチェック def is_valid(grid, y, x, val): if val in grid[y]: return False if val in [i[x] for i in grid]: return False # NxNブロックの判定 t_x, t_y = (x//N) * N, (y//N) * N block = [i[t_x:t_x + N] for i in grid[t_y:t_y + N]] if val in sum(block, []): return False return True # 0の座標を返す def find_next(grid): for y in range(N*N): for x in range(N*N): if grid[y][x] == 0: return x , y return -1, -1 # 数独を解く def solve(grid, y=0, x=0): x , y = find_next(grid) if -1==x or -1==y: return True for val in range(1, N*N+1): if is_valid(grid, y, x, val): grid[y][x] = val if solve(grid, y, x): return True grid[y][x] = 0 return False # ブロックの大きさ N=3 # 初期配列 input_num = [ [5, 8, 7, 2, 0, 0, 0, 0, 1], [9, 0, 0, 0, 0, 0, 4, 0, 0], [0, 0, 0, 1, 8, 0, 6, 0, 0], [0, 0, 0, 0, 0, 4, 7, 2, 0], [0, 5, 0, 8, 7, 0, 0, 4, 0], [0, 0, 2, 0, 0, 0, 0, 0, 0], [0, 4, 0, 0, 0, 3, 0, 0, 0], [0, 0, 0, 0, 0, 7, 2, 9, 3], [0, 2, 1, 0, 0, 0, 0, 0, 0]] solve(input_num) for row in input_num: print(' , '.join([str(i) for i in row]))
5 , 8 , 7 , 2 , 4 , 6 , 9 , 3 , 1
9 , 1 , 6 , 7 , 3 , 5 , 4 , 8 , 2
2 , 3 , 4 , 1 , 8 , 9 , 6 , 5 , 7
1 , 9 , 8 , 3 , 6 , 4 , 7 , 2 , 5
6 , 5 , 3 , 8 , 7 , 2 , 1 , 4 , 9
4 , 7 , 2 , 9 , 5 , 1 , 3 , 6 , 8
7 , 4 , 9 , 5 , 2 , 3 , 8 , 1 , 6
8 , 6 , 5 , 4 , 1 , 7 , 2 , 9 , 3
3 , 2 , 1 , 6 , 9 , 8 , 5 , 7 , 4
一応この実装では
9x9以上の数独にも対応してますが
16x16以上は時間がかかるので
試してませんwww
数独は色々な実装を考えることができ
解き方は1つでは無いかと思います。
もっと効率の良い
実装をすれば16x16の数独なども
素早く解けるのでは無いかと思います。
こういったパズルゲームを
解くのは面白いですよね
今日はコレまでです
それでは。