Orcantus

Guide

Number Place(9×9数字配置)の解き方 — 初級編: 「行・列・3×3ブロックに残る数字が1つだけ」を見つける

Orcantus Puzzlesの「Number Place」は、9×9の盤面に1〜9の数字を、各行・各列・3×3ブロックのそれぞれで一度ずつ入るように埋める、いわゆる数独です。この記事は、実際にプレイしてクリアするための解き方ガイドの初級編です。全3回構成で、初級編(この記事)は盤面の見方・実際の操作と、「そのマスの行・列・3×3ブロックにすでに入っている数字を除くと、残る数字が1つだけになる」という技法(naked single、裸のシングル)だけで解ける基本を扱います。中級編(その2)は「一箇所だけ仮に決めて確かめる」判断が要る問題、上級編(その3)はその仮定を何段も重ねる必要がある問題を扱います。

Note

この記事でいう「初級・中級・上級」は、この解説記事を3段階に分けた読み物としての順番です。Number Place本体の難易度はnumberplace/engine.jsのlevelForBlanks関数が空きマス数(givensの少なさ)だけで判定しており、実際に解く上での論理的な難しさ(どの技法が必要か)を測るものではありません(空きマス数だけに基づく暫定的な指標であることはnumberplace/rating.jsのコメント自身が明記しています)。この記事の初級・中級・上級は、あくまでこの記事が選んだ実例を解くのに必要な技法の複雑さを指します。ただし実例の選定にあたっては、便宜上それぞれアプリ側の難易度easy・medium・hardで生成した盤面から選んでおり(初級編はlevel=easy、中級編はlevel=medium、上級編はlevel=hard)、この対応はこの記事の実例に固有のもので、Number Placeの難易度判定が解く上での難しさを保証している、という意味ではありません。

結論。Number Placeの各マスには、そのマスが属する行・列・3×3ブロックにすでに入っている数字と同じ数字は入らない。空きマスごとに「1〜9のうち、同じ行・同じ列・同じ3×3ブロックにまだ現れていない数字」を数え上げ、それがちょうど1個だけに絞られたマスがあれば、そのマスはその数字で確定する(naked single)。 盤面によっては、この確定を繰り返すだけで、一度も仮定を置かずに全マスが埋まることがある。この記事の実例(9×9・36マス空き)は、まさにこの繰り返しだけで36マスすべてが確定し、実際の完成形(答え)と完全に一致する。

盤面の見方: 行・列・3×3ブロックという3つの単位

Number Placeの盤は9×9=81マスで、太い罫線によって9個の3×3ブロックに区切られています。ルールは次の1つだけです。

最初から数字が入っているマス(givens)はgivenという見た目(背景色などで区別)で表示され、変更できません。それ以外の空きマスに、プレイヤーが1〜9を入力していきます。

使える操作(合法手)

「1マスのヒント」「答えを見る」のどちらを使っても、クリア自体はできますが「解答補助あり」の扱いになり、レート記録の対象外になります(numberplace/app.jsのassistedフラグ)。

盤面のどこかに、同じ行・同じ列・同じ3×3ブロック内で数字が重複しているマスがあれば、そのマスすべてにconflictの見た目(警告表示)が付きます(numberplace/engine.jsのconflictCells)。全81マスが埋まり、かつ矛盾が1つもない状態だけがクリアです。

技法: naked single(裸のシングル) — 候補がちょうど1つに絞られたマス

あるマスに入りうる数字は、「1〜9」から、そのマスが属する行・列・3×3ブロックにすでに入っている数字をすべて除いた残りです。この残りの候補がちょうど1個しかなければ、そのマスはその数字で確定します。これを**naked single(裸のシングル)**と呼びます(この用語自体はNumber Place本体の画面やコードには登場しない、数独の一般的な解法用語です)。

candidatesの絞り込み自体は、numberplace/engine.jsのバックトラッキング探索が使う考え方(511 & ~(rows[r] | cols[c] | boxes[b])というビット演算で候補を求める)と同じですが、この記事で説明する「1マスずつ、候補が1個になったら確定する」という手順自体は、エンジンのコードに実装された機能ではありません。エンジンは候補が最も少ないマスを選んでバックトラッキング探索するだけで、「人間が目で追える形で1マスずつ確定させる」処理は行っていません。この記事の手順は、標準的な数独の解き方をこの記事のために実装し、生成済みの盤面に対して実行して検証したものです(検証方法は「読者の検証方法」の節で説明します)。

実例: 9×9盤を、仮定なしで最後まで解く

シード"notes-numberplace-easy-1"・難易度"easy"で生成した盤面です(E.generate('notes-numberplace-easy-1', 'easy')、1回目の試行でこの条件を満たしました)。出題時点の数字配置は次のとおりです(.は空欄)。空きマスは36個で、levelForBlanks(36)は'easy'と判定されます(BLANK_THRESHOLDS.easy = 45以下)。

8 5 . | . 6 4 | 1 7 9
9 3 . | . . . | 6 2 5
. . 7 | . 2 . | . . .
------+-------+------
3 4 . | 5 . 2 | . 1 .
. . . | 4 7 3 | 9 5 .
5 . 9 | 8 1 6 | 2 . 3
------+-------+------
. . 3 | 2 . . | . . 1
. 6 5 | 7 3 . | 4 8 .
4 2 . | 6 5 . | 3 . .

最初の2手: 行がほぼ埋まっているマスから

行1(1列目)は8 5 . . 6 4 1 7 9で、空きは列3・列4の2マスだけです。列3(マス「行1列3」)を見ると、行1にすでに入っている数字は{1,4,5,6,7,8,9}(7個)で、残りは{2,3}の2択に見えますが、列3にはすでに{3,5,7,9}が、このマスの属する3×3ブロック(行1〜3・列1〜3)にはすでに{3,5,7,8,9}が入っています。行の候補{2,3}から、列とブロックにすでにある3を除くと、残るのは2だけです。したがって行1列3は2で確定します(1手目)。

この結果、行1の空きは列4の1マスだけになり、行にすでに入っている8個の数字(1,2,4,5,6,7,8,9)から、残る数字は自動的に**3だけになります。したがって行1列4は3**で確定します(2手目)。これは列・ブロックを見るまでもなく、行だけで候補が1個に絞られる典型例です。

3手目〜10手目: 同じ考え方を機械的に繰り返す

以降も同じ手順(そのマスの行・列・ブロックにすでに入っている数字を除いて、残りが1個になるかを確認する)を、盤面の左上から右下に向かって繰り返し適用していくと、次のように確定していきます(使用済みは、その時点でそのマスの行・列・ブロックにすでに入っている数字の一覧)。

手順 マス 数字 行の使用済み 列の使用済み ブロックの使用済み
1 行1列3 2 1,4,5,6,7,8,9 3,5,7,9 3,5,7,8,9
2 行1列4 3 1,2,4,5,6,7,8,9 2,4,5,6,7,8 2,4,6
3 行2列4 1 2,3,5,6,9 2,3,4,5,6,7,8 2,3,4,6
4 行2列5 8 1,2,3,5,6,9 1,2,3,5,6,7 1,2,3,4,6
5 行2列6 7 1,2,3,5,6,8,9 2,3,4,6 1,2,3,4,6,8
6 行3列2 1 2,7 2,3,4,5,6 2,3,5,7,8,9
7 行3列4 9 1,2,7 1,2,3,4,5,6,7,8 1,2,3,4,6,7,8
8 行3列6 5 1,2,7,9 2,3,4,6,7 1,2,3,4,6,7,8,9
9 行3列7 8 1,2,5,7,9 1,2,3,4,6,9 1,2,5,6,7,9
10 行3列9 4 1,2,5,7,8,9 1,3,5,9 1,2,5,6,7,8,9

たとえば7手目(行3列4=9)は、行に{1,2,7}(3個)しか使われておらず候補が多そうに見えますが、**列にはすでに8個(1,2,3,4,5,6,7,8)**が入っており、列だけで候補が9の1個に絞られています。このように、行・列・ブロックのどれが決め手になるかはマスごとに異なります。

11手目以降: 同じ手順を最後まで

同じ手順(行・列・ブロックの使用済み数字を除いて、残りが1個になったマスを確定する)を繰り返すと、残る26マスも次の順で確定していきます。

11 行4列5=9   12 行4列7=7   13 行5列2=8   14 行5列9=6   15 行6列2=7
16 行6列8=4   17 行7列1=7   18 行7列2=9   19 行7列5=4   20 行7列6=8
21 行7列7=5   22 行7列8=6   23 行8列1=1   24 行8列6=9   25 行8列9=2
26 行9列3=8   27 行9列6=1   28 行9列8=9   29 行9列9=7   30 行2列3=4
31 行3列1=6   32 行3列8=3   33 行4列3=6   34 行4列9=8   35 行5列1=2
36 行5列3=1

36手すべてで、行・列・ブロックの候補を除いていくと残りがちょうど1個になり、一度も「2択のうちどちらか分からない」という場面が現れません。 36手目が終わった時点で全81マスが埋まり、完成形は次のとおりです。

8 5 2 | 3 6 4 | 1 7 9
9 3 4 | 1 8 7 | 6 2 5
6 1 7 | 9 2 5 | 8 3 4
------+-------+------
3 4 6 | 5 9 2 | 7 1 8
2 8 1 | 4 7 3 | 9 5 6
5 7 9 | 8 1 6 | 2 4 3
------+-------+------
7 9 3 | 2 4 8 | 5 6 1
1 6 5 | 7 3 9 | 4 8 2
4 2 8 | 6 5 1 | 3 9 7

この完成形は、E.generateが実際に生成時点で持っていた完成盤(answerフィールド)と1マスの違いもなく一致します(実行して確認済み)。各行・各列・各3×3ブロックに1〜9が過不足なく1回ずつ現れることも確認済みです。

誤りやすい判断

読者の検証方法

この記事が確認していないこと

この結果が言っていないこと

  • 検証はnumberplace/engine.js・numberplace/app.js(エンジンv1、2026-09-29時点)を対象にしています。将来の版で表示・判定基準が変わる可能性があります。
  • 「naked single」「候補」「使用済み」という用語・表・手順番号は、この記事独自の説明用の表記です。Number Place本体の画面上には候補の自動表示や手順番号はなく、実際のUIはマスの数字とメモ(プレイヤーが自分で書く候補)のみで判断します。
  • この記事の解法手順(naked singleを繰り返し適用する処理)はnumberplace/engine.jsに実装された機能ではなく、この記事のために独立に実装し、生成済みの盤面(E.generateの出力)に対して実行して検証したものです。