2012-03-13 10 views
1

私はスドクジェネレーターを持っています。 私のアルゴリズム:LINQ斜めスペーサーフィラー

  1. 完全なスクロールグリッドに数字を入力して、有効な塗りつぶし9x9グリッドを作成します。
  2. 特定の数値を削除します。
  3. 解決できるかどうかを確認します。
  4. 人間の解法の実装で解決し、使用する技術の難しさに応じて難易度を高めます。

問題は、私のブルートフォースアルゴリズムは、通常の数独のために完璧に動作し、ステップ1であるが、私は、対角数独を作るしようとしたときに生成時間が増加する(グリッド内の対角2のそれぞれは、あまりにもユニークな番号を持っている必要があります)分。これは受け入れがたい。

私は良い解決策は、linqを使用してグリッドを埋めることです。

私の考えは次のとおりです。すべての可能なセルと値の

  1. メイクコレクション(81位、9つの可能な値とそれぞれ)。
  2. は今、このようなqueryesのクエリのいくつかの並べ替えを作成:すべての可能な細胞から

    • を、それぞれの位置が正確に一度だけ存在しなければならない(例えば、一度、一度セル1,1を0,0を細胞です。)。
    • (セルが対角線上にある場合、または対角)の各セルの値(1-9)は、その行、セル及び正方形内で一意である必要があり
    • 返さ組み合わせは、各時間

ランダムでなければなりません私は良い解決策があると確信していますが、私はまだ見ていません。linqの私のスキルはかなり限られているので、私は正しい方向に私を向けることに非常に感謝します。ありがとうございました。

+2

LINQのアルゴリズム速くすることはありません。 Linqは主に、コードを書くのがより便利になる関数のセットです。この利便性は、その汎用性のため(主にIEnumerableに適用されるため)、パフォーマンスコストがかかります。私はあなたがあなたのアルゴリズムを10倍に並列化することです(あなたのアルゴリズムを書き直したくない場合はもっと効率的です)。それを行う方法については、このMSDNのヘルプを参照してください。 http://msdn.microsoft.com/en-us/library/dd460720.aspx –

+0

+1よく並列化できる問題のように見えます。確かに、linqは決して挑戦したくない様々な問題を魔法のように解決すると思われます。しかし、パフォーマンスコストは必ずしも真実ではない、私は追加するかもしれない。例えば、Except()のような集合演算は、手作業でコード化されたネストされたforeachループ(私が行うとき、それは:)です)。 –

+0

Vojtech、[codereview](http://codereview.stackexchange.com/faq)でコードを共有したいかもしれません。 –

答えて

0

ことはあなたが実際にあなたがこの記事にオーバー向かうはずですC#で数独を実装する方法を確認するために探している場合:http://www.codeproject.com/Articles/11983/Sudoku-Solver-and-Generator

+0

私はすでにソルバーとジェネレータを実装しています。この特定のメソッド(塗りつぶしグリッドを作成する)を最適化するだけです。 –

+0

あなたが適切なジェネレータを持っていれば、解決可能なスードクを生成するのに少し時間がかかります。その後、あなたが記述し、難易度をいくつか取り除くことができるはずです。行または対角線内の数字を削除する、実際にはアルゴリズムは全く違いを生むべきではない – ntziolis