Puzzling.SEの友人に次のパズルが投稿されました。この色彩パズルは常に解決可能ですか?エドガー・G。ここでプレイできます。
パズルの説明
m x n
3つの異なる色のタイルを含むグリッドがある場合、色が異なる場合は、隣接する2つのタイルを選択できます。これらの2つのタイルは、3番目の色、つまり、これら2つのタイルで表されない1つの色に変換されます。すべてのタイルが同じ色を持っている場合、パズルは解決されます。どうやら、1ができることを証明どちらも場合は、このパズルは、常に解決可能であることも3で割り切れるされません。m
n
もちろん、これは解くアルゴリズムを求めます。このパズルを解決する関数またはプログラムを作成します。「副作用」を持つ関数(つまり、stdout
いくつかの厄介なデータ型の戻り値ではなく出力がオンになっている)は明示的に許可されていることに注意してください。
入出力
入力はm x n
、整数1
、2
および3
(または0
、便利な場合1
、2
)で構成される行列になります。この入力は、適切な形式で入力できます。どちらm
とn
している>1
あなたは、パズルが解決されていないと仮定して3で割り切れないと
その後、パズルを解きます。これには、「変換」される2つの隣接するタイルを繰り返し選択する必要があります(上記を参照)。これらのタイルの2つの座標を、解決アルゴリズムが実行した各ステップに対して出力します。これは、任意の健全な出力形式でもかまいません。座標の0から1のインデックス付けと、行または列のどちらを最初にインデックス付けするかを自由に選択できます。ただし、これを回答に記載してください。
元の8x8のケースでは、アルゴリズムは妥当な時間内に実行されるはずです。明示的に許可されていない、それを完全にけだもの強制、あなたのアルゴリズムがもとで実行する必要がありますつまりO(k^[m*(n-1)+(m-1)*n])
とk
解決のために必要なステップの数。ただし、ソリューションは最適である必要はありません。リンクされた質問で与えられた証拠は、これを行う方法についてのアイデアを与えるかもしれません(例えば、最初に垂直に隣接するタイルのみを使用してすべての列を実行し、次にすべての行を実行します)
テストケース
これらのテストケースでは、座標は1から始まり、行に最初にインデックスが付けられます(MATLAB / Octaveおよびおそらく他の多くのものと同様)。
Input:
[1 2]
Output: (result: all 3's)
[1 1],[1,2]
Input:
[ 1 2
3 1 ]
Output: (result: all 1's)
[1 1],[2 1] (turn left column into 2's)
[2 1],[2 2] (turn right column into 3's)
[1 1],[1 2] (turn top row into 1's)
[2 1],[2 2] (turn bottom row into 1's)
Input:
[1 2 3 2
3 2 1 1]
Output: (result: all 3's)
[1 1],[1 2]
[1 3],[1 4]
[1 2],[1 3]
[1 1],[1 2]
[1 2],[1 3]
[1 1],[1 2]
[1 3],[1 4]
[2 1],[2 2]
[1 1],[2 1]
[1 2],[2 2]
[1 3],[2 3]
[1 4],[2 4]
必要に応じて、より大きなテストケースのペーストビンを投稿することもできますが、これで十分だと思います。