Menu
CoddyTech

Sudoku Solver

むずかしいバックトラッキングpython iconjava iconcpp iconc iconjs icon+10

数独盤は、9 × 9 のマス目を9つの 3 × 3 のブロックに分けたものです。解答済みの盤では、各行、各列、各ブロックに1から9までの数字がそれぞれちょうど1回ずつ入っています。

パズルは9個の文字列として、上から各行につき1つずつ与えられます。.は空のマスです。すべての空のマスを埋め、同じ形式で解答済みの盤を返してください。この盤には解が1つだけあります。

関数

solveSudoku(board: string-array) → string-array
boardstring-array
パズルの9行、それぞれの空欄に1つずつ点
戻り値string-array
解答済みの盤面の9行

制約

  • boardは長さ9の文字列を9個保持しています。
  • すべての文字は . または数字の 1 から 9 のいずれかです。
  • 与えられた数字は、行、列、またはブロック内で重複しません。
  • 盤面には解がちょうど1つあります。

例

入力
board = ["9.7.....6", "824.3....", "..1..9..2", ".9...2.18", "...4....5", "1325.8...", "...687...", "......8.9", ".4.9...5."]
出力
["957214386", "824736591", "361859742", "495372618", "786491235", "132568974", "519687423", "273145869", "648923157"]
説明
一番上の行 9.7.....6 にはすでに9、7、6が入っているので、6つの空きマスには1、2、3、4、5、8が入ります。それぞれの数字がどこに入るかは、列とブロックによって決まり、この行は 957214386 になります。
challenge icon

発展問題

キラー数独では、マスのケージの合計も指定された数になる必要があります。このルールを探索に追加し、枝を早い段階で打ち切るにはどうすればよいでしょうか?

コードをリセット
def solveSudoku(board):
    # ここにコードを書いてください

テスト #1

引数

board = ["9.7.....6", "824.3....", "..1..9..2", ".9...2.18", "...4....5", "1325.8...", "...687...", "......8.9", ".4.9...5."]

期待される出力

["957214386", "824736591", "361859742", "495372618", "786491235", "132568974", "519687423", "273145869", "648923157"]