piapia123
ja

数独の解答と生成

変換

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

使い方は三つ:解答・検証・問題の生成です。解答はバックトラックと候補ビットマスクを使い、各手でどの戦略(唯一の候補・隠れた唯一・試し置き)を使ったかを任意で表示します。検証は同じ行・列・ブロックで数字が重複している箇所を具体的に指摘し、解が一つか、複数か、無いかを判定します。生成は完成した解からランダムに穴を掘り、一つ掘るたびに唯一解のままかを検証するので、渡される問題は答えが必ず一つです。 ⚠️ 生成は lib/random.ts の乱数源を使い、Math.random は使いません。シードを入れれば同じ問題を再現できます。 すべてブラウザ内で完結し、接続も送信も行いません。

機能

  • 9 行を貼り付けるだけで解答。空欄は . か 0、81 文字の短縮文字列にも対応
  • 任意で手順を表示し、各手の戦略も明記
  • 検証では重複した数字の行・列・ブロックと具体的なマスを指摘
  • 唯一解か、複数解か、解なしかを判定(2 つ数えたら停止し、全列挙はしない)
  • 生成は完成解から穴を掘り、毎回唯一解かを検証
  • 難易度は 3 段階:簡単/ふつう/難しい
  • シードを入れれば同じ問題を再現
  • 不正な入力や重複は具体的な行・列を示して報告
  • すべてブラウザ内で完結し、データは送信されません

使い方

  1. モードを選びます:解答/検証/問題の生成
  2. 解答・検証では 9 行(1 行 9 マス、空欄は . か 0)を貼り付けます
  3. 生成では難易度を選び、必要ならシードを入れます
  4. 結果は即座に表示され、各行をコピーできます

よくある質問

唯一解かどうかはどう判定しますか?
バックトラック探索で判定しますが、解を 2 つ見つけた時点で停止します —— 空の盤面には約 6.67×10²¹ 個の解があり、全列挙は何世紀もかかります。「唯一かどうか」には 0・1・2 以上の 3 通りで十分なので、それ以上は数えません。
生成した問題が唯一解なのはなぜですか?
完成した解からランダムに穴を掘り、一つ掘るたびに上のカウンターで「まだ唯一解か」を検証し、そうでなければそのマスを戻すからです。この手順がないと、「解けそうなのに実は複数の答えがある」問題ができてしまいます。
手順に出てくる 3 つの戦略とは?
唯一の候補:そのマスに入る数字が一つだけ。隠れた唯一:ある数字がその行・列・ブロックの 1 マスにしか入らない。試し置き(バックトラック):どちらの直接法でも進まないため、数字を仮に置いて進み、行き詰まれば戻します。
重複した数字があると解答がエラーになるのはなぜですか?
重複のある盤面は解が存在しないからです。そのまま計算しても「解なし」になるだけで、本当の問題は重複したマスにあります。そこで重複している行と列を直接示します。

関連ツール