2016-04-25 9 views
0

私は、ブルートフォースアルゴリズムを利用してコードロックを解決する方法に取り組んでいますが、私はこれをいかに効率的に行うことができるかについてアイデアが不足しています。 This image shows how my program is structured.ブルートフォースaコードロック

アルゴリズムは、それぞれが任意の量の列を含むことができる任意の量の行に作用するべきであるという考えがあります(理由は、50個以下の合計の2乗を意味します)。最初の四角形に '2'を配置し、次に空の四角形に '3'を配置するなどして開始する必要があります。メソッドがtrueを返す場合、それは停止します。そうでない場合は、最初の四角に「3」を置き、次に「3」を入力して再起動します。

すべての行のすべての正方形が正しい桁を持つとき、ロックは開いていると見なされます。メソッドはtrueを返します。可能なすべてのシーケンスが試され、何も機能していないとき(プログラムのどこかで何かが間違っていた)、falseを返すだけです。

最初の行のみを考えてみましょう。正しい順序は "3 - 4 - 9"としましょう。上の画像に続いて、これはtrueを返す必要があります。

//Returns true for a = 0, b = 0, c = 1 --- x = 0, y = 1, z = 2 

allEmptySquares[a][b].putValue(allEmptySquares[a][b].getPossibleSolutions.someArray[c]); 
allEmptySquares[x][y].putValue(allEmptySquares[x][y].getPossibleSolutions.someArray[z]); 

私は、forループ使用して、メソッドの再帰を作ってみましたが、私は解決策は、z> Cを持っているとき、それは仕事を得ることができません。

これを書く方法についてのヒントを教えてください。

編集:私のコードを書くよりも、可能な解決策のアイデアにもっと興味があります。

編集:私は大きなディテールについて言及していませんでした。新しい桁が得られるすべての四角形に対して、他の四角形の選択肢は少なくなります。それは数独のように考えてください。つまり、someArray.length = 0の場合、メソッドは2番目の段落で説明したように再開します。最後の四角はsomeArray.length = 1になります。他のすべての四角が正しい桁を受け取っている場合は1です。

編集:可能な解決策と、どの四角形があらかじめ入力されているかは、プログラムの他の場所で決まるため、この方法は可能な限り「汎用」である必要があります。

+0

あなたはこの問題が実際に解決するには大きすぎる理解し、右?あなたの「理由」の例には10^50の解決策があります。あなたは3桁のロックのようなより簡単な問題を解決するコードを書いて、コードを表示してください。 – markspace

+0

しかし、あなたはアルゴリズムを持っています。あなたが求めているのは、「このアルゴリズムを実装するにはどうしたらいいですか? - これはコードです。マークスペースが指摘しているように、10^50はかなり大きいです。例えば、1ナノ秒ごとに1つのコードをチェックした場合、3.16887646×10^33年です。 – gilleain

+0

一方、質問は、まだそれは少し神秘的です。なぜ2ではなく1で始まるのですか?なぜ可能な解決策は、[1 ... 9]ではなく、[3,7,9]だけに戻るのでしょうか? – gilleain

答えて

1

私は数独のために使った設定を一度適応させることができます。それはまだ強引ですが、制約については少し洗練されています。

基本的な流れは、選択 - 拘束 - マーク - バックトラックです。最初に "開いている"正方形に値を代入することから始めます(最初の可能な値に移動します)。次に、制約チェックを実行して、他の正方形のすべての値を制限します。いずれかが1つの値に限定されている場合は、その値を割り当てて、制約の追加を再実行します。有効な割り当てですべてのものを見つけたら、それを返します。複数の選択肢がある場合は、1つを選択してもう一度やり直してください。任意の広場に対して有効な選択肢がない場合は、最後に行った選択に戻り、次の選択を試みます。

(コールスタックが検索スタックと同じであるので、「戻る」の設定をセットアップする最も簡単な方法は、再帰関数呼び出しである。)

関連する問題