友達が自分のパスワードをAndroidスマートフォンに入力しているのを見たとしましょう。彼らがどのようにパターンを作ったかは覚えていませんが、パターンがどのように見えるかは覚えています。あなたがあなたであるという懸念の友人であることは、彼らのパスワードがどれほど安全であるかを知りたいです。あなたの仕事は、特定のパターンを作成できるすべての方法を計算することです。
Androidパターンの仕組み
パターンはノードの3x3グリッドに描かれます。パターンでは、画面から指を離さずに一連のノードにアクセスします。訪問する各ノードは、エッジによって前のノードに接続されます。留意すべき2つのルールがあります。
1つのノードに複数回アクセスすることはできません
エッジは未訪問のノードを通過できません
通常、実行するのは非常に難しいため、実際のAndroidロックの組み合わせではあまり一般的ではありませんが、Knightのように移動することができます。つまり、一方の側から隣接していないコーナーに移動したり、反対側に移動したりすることができます。このような動きを採用したパターンの2つの例を次に示します。
これが実行されているアニメーションGifです。
パターンを解く
典型的なパターンは次のようになります。
このような単純なパターンでは、2つの方法でパターンを描画できます。2つのルーズエンドのいずれかから開始し、強調表示されたノードを介してもう一方に移動できます。これは多くのパターン、特に人間が通常使用するパターンに当てはまりますが、すべてのパターンに当てはまるわけではありません。
次のパターンを検討してください。
すぐに認識できる解決策が2つあります。左上から始まるもの:
そして、下中央から始まるもの:
ただし、線が選択されると、ポイントを通過することが許可されるため、上部中央から始まる追加のパターンがあります。
この特定のパターンには3つのソリューションがありますが、パターンには1〜4のソリューションがあります[要出典]。
それぞれの例を次に示します。
1。
2。
3。
4。
I / O
ノードは、0から9までの整数、それらに相当する文字列、またはaからi(またはAからI)の文字として表すことができます。各ノードには、これらのセットのいずれかからの一意の表現が必要です。
ソリューションは、ノード表現を含む順序付けられたコンテナで表されます。ノードは、通過するのと同じ順序で並べる必要があります。
パターンは、ノードのペアの順序付けられていないコンテナで表されます。各ペアは、ペアの2つのポイントを接続するエッジを表します。パターン表現は一意ではありません。
パターン入力を標準入力メソッドを介して入力として受け取り、標準出力メソッドを介して同じパターンを作成するすべての可能なソリューションを出力します。
各入力には少なくとも1つのソリューションがあり、少なくとも4つのノードを接続すると想定できます。
希望する場合、または言語の選択により強制される場合は、順序付けられていないコンテナの代わりに順序付けされたコンテナを使用することを選択できます。
テストケース
ノードを次のパターンで配置します。
0 1 2
3 4 5
6 7 8
ましょう{...}
、順不同容器で[...]
注文した容器であり、(...)
ペアこと。
次の入力と出力は一致する必要があります
{(1,4),(3,5),(5,8)} -> {[1,4,3,5,8]}
{(1,4),(3,4),(5,4),(8,5)} -> {[1,4,3,5,8]}
{(0,4),(4,5),(5,8),(7,8)} -> {[0,4,5,8,7],[7,8,5,4,0]}
{(0,2),(2,4),(4,7)} -> {[0,1,2,4,7],[1,0,2,4,7],[7,4,2,1,0]}
{(0,2),(2,6),(6,8)} -> {[0,1,2,4,6,7,8],[1,0,2,4,6,7,8],[8,7,6,4,2,1,0],[7,8,6,4,2,1,0]}
{(2,3),(3,7),(7,8)} -> {[2,3,7,8],[8,7,3,2]}
{(0,7),(1,2),(1,4),(2,7)} -> {[0,7,2,1,4],[4,1,2,7,0]}
{(0,4),(0,7),(1,3),(2,6),(2,8),(3,4),(5,7)} -> {[1,3,4,0,7,5,8,2,6]}
{(1,3),(5,8)} -> {}
写真としてすべてのテストケースのimgurアルバムはここで見つけることができます。パターンは赤の青のソリューションです。
得点
これはコードゴルフです。少ないバイトが勝ちます。