TOP > カテゴリ > 数学・アルゴリズム >

ナンプレの問題を自動で作成する

パズルゲームの中でクロスワードに匹敵するぐらい人気の高い「ナンプレ(数独)」の問題をプログラムで自動的に作成する方法をご紹介します。ソースコードはマイナーなDelphiで作成した為、添付していませんが簡易的な設計書を用いて解説します。理解できればあなたもナンプレの問題を無制限に作成する事が出来ます。

ナンプレとは?

2005年頃から世界的にブームとなったパズルゲームです。日本では「ナンバープレース」とも呼ばれています。3x3のブロックが9つあり、マスの合計は81個で初期時には25-40個程度の数字が埋まっています。ナンプレは空きマスに1~9の数字を入れるペンシルパズルの一種です。また、同じ数字はブロック、行、列毎に一つだけで重複する事は出来ません。

実際のナンプレは下記のサイトで確認する事が出来ます。
無料で遊べるナンバープレース (外部サイト)

ナンプレを自動作成する

1.はじめに

最初にナンプレの表が9つのブロックに分かれている事を確認します。

次にナンプレの「ブロック内と表のタテヨコラインでは同じ数字が重複しない」という条件を覚えておきましょう。ここがナンプレで重要な内容です。

2.設計書

1.の内容が把握できれば、下記の簡易的な設計書でナンプレを自動作成するプログラムが書けると思います。getNanpre()がメイン関数となります。

/* 変数 */
・ナンプレの全マス用の2次元配列(9つのブロック x ブロック内の9つのマス) // 問題の答え
・ナンプレの全マス用の2次元配列(9つのブロック x ブロック内の9つのマス) // 問題(マスに空欄あり)

// ナンプレの「問題」と「答え」を作成する関数
getNanpre(){
  1.全マス用の2次元配列の初期化
  2.問題の答えの作成
    ※setBlock()を9回呼び出して1-9ブロック内のマスを埋める
  3.問題の作成
    ※作成された「答え」をコピーして任意のマスを空欄にして「問題」とする
}

// (指定された)ブロックへ数字を設定する
setBlock(){
  // ブロック内の一つ一つにsetValue()で値を設定する
  for x{
    for y{
       // マスへ値を設定する
       setValue();
    }
  }  
}

// (指定された)マスへ値を設定する
setValue{
  ・ブロック及びタテライン・ヨコラインで重複しない値をランダム値で取得して設定する  
}

3.注意事項

・答え作成のコアはランダムで発生させる為、答えが作成されない場合がある
・複数の答えを作成する場合は重複した答えを切り捨てる

最後に

ナンプレの答えを算出する方法としては初歩レベルですが、一番の要は答えから問題を作る部分です。初級~上級のレベル設定やX型やS型などの問題にするなど、いかにオリジナルティのある問題を作れるかになると思います。

それでは、良いアルゴリズムを作ってくださいね :-)





関連記事



公開日:2015年02月14日
記事NO:00215