数独パズルを生成するにはどうすればよいですか?


17

数独パズルジェネレーターを作成しようとしています。それは私が予想したよりもはるかに困難であり、私がそれに夢中になるほど、それは難しくなります!

私の現在のアプローチは、問題を2つのステップに分割することです。

  1. 完全な(解決された)数独パズルを生成します。
  2. 解決可能になるまで解決策が1つになるまで数字を削除します。

ステップ1では、ブルートフォースメソッドを使用しているため、実行時の問題に直面しています。完全な数独パズルを埋める最適な方法はありますか?

ステップ2では、解決した数独を「パズル化」するためにどのようなアルゴリズムを使用する必要がありますか?


この質問には、パズルを生成する方法で抽出できる情報がいくつかあります
ラチェットフリーク

3
この質問はまた不可解な(そしてそこに、より良い答えを持っている)に頼まれました:puzzling.stackexchange.com/questions/142/...
congusbongus

回答:


30

iOSアプリストアでトップセラーの数独ゲームを持っています。パズルを生成する方法は次のとおりです。

まず、パズルジェネレーターアプリケーションがあります。しかし、それはゲームのコードの一部ではありません。これは、パズルを作成するために使用するスタンドアロンのアプリです。高度に修正されているため、さまざまなパターンタイプ、難易度評価、与えられた数などを作成するように設定できます。パズルを生成し、一貫した難易度を取得することは、その場で行うのが難しく、プレイヤーが待ちたい時間よりも時間がかかります。だから、私は「シードパズル」と呼ぶものを生成します。それは、人々がプレイするパズルを生成するためにゲームのコードによって使用されるものです。

ここでは、ジェネレータのコーディング方法については答えていません。Googleを使用して、大量のパズルジェネレータコードをオンラインで見つけることができます。そこから始めましょう。しかし、良いゲームを作るには、良いゲームを作る必要があります。私のゲームはパズルを即座に生成しません。

私のパズルジェネレーターアプリは、1分間に数千のパズルを生成しますが、すべてがうまくいくわけではなく、すべてが特定の難易度評価と一致するわけではありません。ジェネレーターはパズルを作成し、それを解決して難易度を計算し、パズルを解決するために必要な技術に基づいてパズルをスコアリングし、それを解決するために推測が必要かどうかを判断します(通常は悪い)。基準に一致しないパズルを投げ出します。難しいが不可能ではないパズルの場合、高速マシンでは、私の仕様に合った100個のパズルを生成するのに1時間かかることがあります。これがアプリでこれをしない理由です。これらの厳しい仕様を使用してパズルをオンザフライで生成することは、アプリにあるパズルの品質には役立ちません。

パズルは、文字列で、長さ162文字、数字が81文字で、空白が配置される点とダッシュまたはドットがあり、さらに81文字が解決策です。次に、シングル、ダブルなどの数など、各統計の列

すべての生成セッションからの出力は、列として統計を含むカンマ区切りの行です。多分10,000個のパズルを取り、それらをエクセルに持ち込み、難易度で並べ替えます。次に、それらをアプリに取り込み、ゲームボードで表示します。また、視覚的魅力とパズルの目に見えるパターンについても調べます。それから私はそれらから手摘みします。

私はそれらをシードパズルと呼びます。数独ゲームの数字は、実際には単なるトークンです。1〜9の数字ではなく、色、記号、または文字にすることができます。ですから、私の種のパズルは数字ではなく、文字aiです。各シードパズルはオンザフライで変更され、プレイ可能なパズルを作成します。

  1. 番号/トークンをランダム化します。文字aiを1〜9の数字に戻すと、ルックアップテーブルがランダム化されます。aが常に1とは限らないことを意味します。それだけで、各パズルに約300,000のバリエーションが作成されます。
  2. パズルを90、180、または270度回転させます。これにより、さらに4つのバリエーションが追加されます。
  3. パズルを水平、垂直、またはその両方に切り替えます。これにより、さらに4つのバリエーションが追加されます。

したがって、各シードパズルは5,806,080個のバリエーションを作成できます。私はこれを実際のプレイヤーのフィールドでテストしました。人々は、本質的に同じパズルをプレイしていることを知りません。実際には不可能です。彼らが与えられたパターンが毎回同じであることに気づいた場合にのみ。しかし、100種類もの種子があっても誰も気付かないでしょう。私のゲームの100万人のユーザーはそうではありません。ソルバーアプリでもテストしました。ソルバーアプリは、回転またはフロップしてもパズルを同じように解決しません。技術的には同じパズルであっても、異なる難易度として分析することさえあります。

ただし、Big Bad Sudoku Bookには、5種類の難易度の1000種類のパズルが10種類あり、複数のパズルパターンがあります。これは、私のゲームには数十億のパズルがあることを意味します。10,000シードパズルごとに、58,060,800,000の異なるパズルがあります。

Sudoku Bookバージョン4(2016年未定)で、580億から正確なパズルを指定して、各プレイヤーのデバイスで同じパズルを取得する方法を見つけました。


非常に便利な投稿。何らかの方法で、生成したシードが他のシードから作成できるかどうか、つまり同じシードを持っているかどうかを確認しますか?
VLAS

はい。それらをすべてテキストメイトにドロップし、ソートを行います。次に、重複を削除します。削除されるとは思わない。種子は絶対にユニークです。2つの異なる種から同じパズルを作ることは不可能です。いつか正確なプロセスを紹介しますが、今はまだ私の方法から利益を得ているときではありません。:)
badweasel

実際、私の全体のプロセスはほとんどここにあります。
badweasel

2
数字は単なるトークンであり、バリエーションを作る方法は文字に割り当てられた数字を変更するだけであるという洞察のために+1。
S.ミッチェル

本当に便利な答え!3つの列と3つの行があるため、中央の列を左または右に移動し、中央の行を上部または下部に移動して、さらに4つのバリアントを生成できます。そして、パズルを垂直に反転したり水平にフロップしたりする代わりに、左右の列(および上下の行)をさらに4つのバリエーションと交換することができます。したがって、1つのシードから4,300万のバリエーションを取得する必要があると思います。
Roger_S 16

4

ステップ(1)完全な(解決された)数独パズルを生成します。ブルートフォースメソッドを使用しているため、実行時の問題に直面しています。完全な数独パズルを埋める最適な方法はありますか?

完全な数独パズルを埋める簡単な方法があります-グループ充填と循環シフト。

  1. 最初の行に9つの異なる数字を入力します。
  2. 最初の行を3スロット分シフトした2行目を埋めます。
  3. 2番目の行を3スロット分シフトした3番目の行を埋めます。
  4. 3番目を1スロット分シフトした4番目の行を埋めます。


line 1: 8 9 3  2 7 6  4 5 1
line 2: 2 7 6  4 5 1  8 9 3 (shift 3)
line 3: 4 5 1  8 9 3  2 7 6 (shift 3)

line 4: 5 1 8  9 3 2  7 6 4 (shift 1)
line 5: 9 3 2  7 6 4  5 1 8 (shift 3)
line 6: 7 6 4  5 1 8  9 3 2 (shift 3)

line 7: 6 4 5  1 8 9  3 2 7 (shift 1)
line 8: 1 8 9  3 2 7  6 4 5 (shift 3)
line 9: 3 2 7  6 4 5  1 8 9 (shift 3)

ユーザーが明らかなパターンに気付かないようにするには、行と列の順序をランダム化して、パターンがなくなるようにすることをお勧めします。各行/列の9つの数字すべてが1つのアトミックユニットとして一緒に移動する限り、数独ボードは常に有効です。

完全な数独パズルが完成します。詳細については、「数独を作る」を検索できます。


3

数独ソルバーがあれば、それほど難しくありません。

数独ソルバーを作成するのは難しい/興味深い問題なので、別の質問のために保存するのが最善です。または、あなたはただ読むことができますこれどのように行くかを見るます。

  1. 解決されたパズルを生成するには、単に空のボードでソルバーを実行します。唯一の注意点は、ソルバーが使用する「推測」をランダム化することです。そうしないと、毎回同じパズルになってしまう可能性があります。つまり、ある時点で、ソルバーはセルの数値を試行します。次の順序で試してみてください:1, 2, 3, 4, ...そして、最初に機能するものを選択します。たとえば、その順序をシャッフルする必要があり4, 7, 2, 9, ...ます。このプロセスは、ソルバーと同じくらい高速でなければなりません。
  2. 番号を削除するには、次のアルゴリズムを使用します。
    • 以前に削除しようとしたことがない乱数を選択します
    • 番号を削除し、ここで削除した番号を使用できないという条件を追加してソルバーを実行します
    • ソルバーが解を見つけた場合、数字を削除することはできません
    • 十分な数を削除するまで(または削除できなくなるまで)繰り返します。

これは非常に単純な(そして素朴な)方法であるため、特定の難易度のパズルが得られる保証はありません-不足している数字の数は別として-または、必要な数の数字を削除することさえできます。とにかくこれが役立つことを願っています。


ソルバーが同じ状態から複数のソリューションを見つけられないことを確認してください。通常、解決策は1つだけです。また、難易度を判断するための解決策を見つけるためにソルバーが実行する必要のある論理ステップを確認できます。たとえば、x-wing戦略を使用する必要があったのか...
OriginalDaemon 14年

1
@OriginalDaemonは最初の点に関しては、3番目の点でカバーされています。その番号を削除すると2番目の解決策が得られる場合は、戻ってください。
コンガスボン14年

0

このウェブページを指摘することは興味深いと思います。なぜなら、それは私たちのproyectの開発に大いに役立ったからです。ユニークなソリューションで数独を作成することは、単純なタスクからはかけ離れています。リンクでは、著者がどのようにいくつかの異なる戦略を見つけたのかを見つけることができます(彼は本当に素晴らしい仕事をしました。独自の数独ソルバーを生成するためのアイデアがあります。

さて、トピックに沿って、同様の数独を生成する方法もあります。

  1. 行の順列。
  2. 他の簡単な解決策は、最小17桁の数独記入(独自の解決策を見つけるための実証済みの最小)の記入から開始し、次の異なる戦略を記入することです(たとえば、前のリンクでは、戦略は難易度で分けられています、似たようなことができます)、ユニークなソリューションに到達するまで。
  3. 17桁の数独のHUGEEEEEEリストを使用して、16桁のユニークな数独ソリューションを探している数学者のリストがありました。彼がどんな種類のコピーライトを持っているか覚えていないが、彼に他の17のユニークなソリューションを提供できるなら、数独は彼のデータを使うことを喜んでくれるだろう。

乾杯とアルゴリズムの幸運:D


うーん、リンクは数独ソルバー用であり、ジェネレーター用ではありません。
greenoldman

@greenoldmanはい、その解決策です。彼は現在の方法であるため、数字を削除して解決するので、ユーザーにとって興味深いと思います。このリンクは、彼のパーシャル数独をより速く解決するための戦略を提供します
デビッドサンチェス

0

私のソルバーはブルートフォースを使用しており、20ミリ秒以内に解決策を見つけることができます。上記の削除方法を使用すると、ジェネレーターは200ミリ秒以内にパズルを作成します。

通常は、24〜34桁程度のパズルが生成されますが、世界で17桁のパズルをどのように作成できるかはまだわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.