プログラムのアルゴリズムの複雑さを見つける方法がわからないので、「どうやって見つけるのか」を探しています。
効率を考慮せずにJavaを使用して数独ソルバーを作成しました(再帰的に動作するようにしたかったので、成功しました!)
いくつかの背景:
私の戦略では、バックトラックを使用して、特定の数独パズルについて、パズルに固有の解決策が1つしかないかどうかを判断します。だから私は基本的に与えられたパズルを読んでそれを解きます。1つの解決策を見つけたら、必ずしも完了しているわけではありません。さらに解決策を探し続ける必要があります。最後に、考えられる3つの結果のいずれかが発生します。パズルがまったく解決できない、パズルに固有の解決策がある、またはパズルに複数の解決策がある。
私のプログラムは、行、列、および数字で構成される、指定された数字ごとに1行のファイルからパズルの座標を読み取ります。私自身の慣習により、7の左上の正方形は007と書かれています。
実装:
ファイルから値をロードし、2次元配列に格納します。空白(未入力の値)が見つかるまで配列を下に移動し、1に設定します。競合がないかどうかを確認します(値がiかどうか)。入力されたものは有効かどうか)。はいの場合、次の値に移動します。いいえの場合、機能する桁が見つかるまで値を1ずつインクリメントします。機能しない桁(1〜9)がない場合は、調整した最後の値に1ステップ戻り、その値をインクリメントします(再帰を使用)。 )。81個の要素がすべて満たされたら、競合することなく解決が完了しました。解決策が見つかったら、端末に印刷します。それ以外の場合、最初に変更した最初の要素で「1ステップ戻る」ことを試みると、解決策がなかったことを意味します。
私のプログラムはどのように複雑さをアルゴリズム化できますか?線形かもしれないと思った[O(n)]が、配列に何度もアクセスしているので、よくわかりません:(
どんな助けでも大歓迎です