こんにちは!
エルフィールドでエンジニアとして働いている、H.Tと申します

今回は「ナンバープレイス・プログラム」の第4回目になります。


前回のプログラムでは、行・列の制約を考慮しながら数字を配置する手法をベースに、「マスごとに入れられる数字の候補
(フラグ)」を活用して解法を進めました。


今回は視点を少し変えて、“ブロック単位” での配置を起点にプログラムを組み立ててみます。


🔍 ブロックを出発点にする発想

あれこれ試していて、ふと気づいたことがあります。
それは「特定の3ブロックに限れば、他と干渉せずに数字を自由に入れられる」という点です。



たとえば「左上・中央・右下」の3ブロックを選ぶと、それぞれの9マス内の数字は、他の2つのブロックと被らないため、
自由に 1〜9を並べることができます。(もちろん、ブロック内で重複はNG)

実際には「上中央・右中央・左下」など、同じように独立性のある3ブロックの組合せはいくつか存在しますが、
今回はシンプルに「左上・中央・右下」の構成を採用します。

このように、最初に「自由に数字を入れられるブロック」を固定することで、残りのマスに対しては制約が増し、
完成に近づきやすくなるのでは?という考え方を出発点にします。



🧩 設計の概要

  • まず3ブロックに 1〜9 の数字をランダムに配置します
     → 同一ブロック内で重複がなければOK
  • その後、残りのマスに候補となる数字をチェックし、可能な中からランダムで選んで埋めていく形にします


🛠️ 前回のプログラムで使った「フラグ(isX)」や「状態(done)」の管理処理は流用できるので、新たに追加した部分を
中心に説明していきます。



🔀 配列をランダムに並び替える

まずはブロックに入れる 1~9 の数字をランダムに並び替える関数です

📝 ポイント解説

  • Array.from(list19) で元の配列をコピー
  • sort() の中にランダムで -1 または 1 を返す関数を使い、並び順をシャッフル
  • Math.random() で 0 または 1 を出し、* 2 – 1 によって -1 または 1 を生成しています

これはあくまで簡易的なシャッフル手法ですが、目的には十分です。



⚙️ プログラムの全体構成

実際のコードは以下のようになっています。



✅ 実行結果と所感


このプログラムを実行すると…


 空きマスは残るものの、一定の完成度で盤面が埋まります。


運がよければ…




このようにきれいに全マスが埋まることもあります。



🎲 体感的な成功率は4〜5回に1回程度
まだロジックとしては発展途上ですが、十分に「使える」状態に近づいています。



🤔 気づきと今後の展望

✅ 今回の学び

  • ブロック単位の配置は良いスタート地点になる
  • 「状態管理(done/isX)」は、今後の検証・アルゴリズム強化に活かせる
  • ただし「ランダム選択+制約」だけでは完全な完成は難しい


今回のアプローチでは、特定の3ブロックを起点にすることで「数字の自由度を保ったまま盤面を埋め始める」という、
新たな可能性を見出せました。


ただし、それだけで「全マスを確実に埋める」には至らないことも改めて実感。
やはり「候補数の少ないマスから埋める」「分岐を記録しながら進める」など、より戦略的な要素も必要になってきそうです。

次回は、こうした「埋めた結果を自動で評価する仕組み」を導入して、完成度を上げていく基盤づくりに挑戦していきます!



🔜 次回予告

「現在の盤面が正しいかどうか」を自動でチェックする機能を作ります。

  • 重複チェックや不正マスを視覚化
  • 今後のステップ(自動生成やパズル化)への足がかりに!



それではまた次回👋
最後までお読みいただき、ありがとうございました!