あなたの問題は、ある値をシフトする動きが他のものを混乱させることです。私は十分な集合理論では正確な解を試すことができると思うが、ここではヒューリスティックが働く可能性がより高い。
最初に、ある行のすべての数値がその行に属している場合は、解くのは簡単ではないか、一部の値が入れ替わっていることに注意してください。 [2,3,1]は簡単ですが、[3,2,1]はスワップされます。
したがって、1つ左上に配置するよりも「簡単な」ターゲットは、すべての行をその状態にすることです。どうしたらいい?列を見てみましょう...
列に各行の番号が1つ含まれている場合は、上と同じ状態になります(数字が正しい行にあるか、スワップされているかのように単純です)。
ので、私は何を示唆していることである。
for column in columns:
if column is not one value from each row:
pick a value from column that is from a duplicate row
rotate that row
for column in columns:
as well as possible, shift until each value is in correct row
for row in rows:
as well as possible, shift until each value is in correct column
は今、それはそれは近づく傾向がありますが、動作することが保証されておらず、「ほとんど右」配置のいくつかのセットを解決することができます。
だから、私はループ内に置いて、実行ごとに状態の「ハッシュ」を記録します(たとえば、行ごとに読み込まれた値を含む文字列)。状態が既に発生しているので(私たちは自分自身を繰り返しているので)私が検出した場合(ハッシュがすでに見ていたものかどうかをチェックすることによって)、呼び出しを行うたびに、混合する「ランダムシャッフル」が呼び出されます。
だから、私たちが一度閉じてしまえば、私たちは仕事の機会があり、それがループに詰まったときに私たちが頼りにするシャッフルがあるという考えです。
私は言ったように、私はこれを行うよりスマートな方法があると確信していますが、私は絶望的だったし、Googleで何かを見つけることができなかった場合、それは私が試みるヒューリスティックのようなものです...私も確認していない以上、右であるが、より一般的な戦術は、次のとおりです。
- (パズルが「線形」である場合には、知る意味で)
- 試して非常に近いソリューションを解決する何かを識別それは
を繰り返し、それは私がここで言っている本当にすべてだ場合に
シャッフルを繰り返します。
[物理バージョンの解決](http://www.kirix.com/extensions/files/2008/08/puzzle-example.png)のアルゴリズムを調べるだけではいかがですか? –
私は物理的なバージョンの名前を考えることができません。あなたが投稿した写真に「欠落しているタイル」があるので、動作が異なります。私の場合、タイルを入れ替えたり、行や列を回転させたりすることはありません。 – avalore
SQLでそれを解決するためのボーナスポイント... – wildplasser