トピック2つのロックを改善するためのアルゴリズム
制限時間:メモリ制限が1.0S:1.0ギガバイト
問題の説明
あなたが得るには、古代マヤ人が箱を作ったと言われています。あなたは本当に内側にあるものを見るためにボックスを開きたいが、残念ながら、すべてのストーリーのように、時に常に神秘的なロックを掛ける現れる不思議な箱のよう。
ロックルックスNデジタル上記は、それらが列に配置され、各数が0~2の間です。あなたは当局によってロックされた隣接する二つの数字の順番を入れ替えることができますを見つけます。例えば、オリジナルの5桁02120場合は、交換後、あなたは20120,01220,02210または02102を取得することができます。
あなたによると、情報を収集、この上に、それが自動的に開きますと、ロック4つの連続した番号は「2012」であります。さて、あなたがロックを開くためにあることが少なくとも必要で業務を交換回数を計算する必要がありますか?
入力フォーマット
入力データの最初の行は、正の整数Nを有します (4≤N≤13)は、入力NデジタルデータA1、A2の第二ラインを有し、...、aiをANは、≤0を満たすロック上記i番目の桁の値を表す≤2愛。これらの数値の間に違いは、スペースで区切られていません。
出力形式は、
あなたはちょうどあなたが取引所の少なくとも数を必要とし、デジタル出力を必要とします。いずれにしても、彼はロックを開くことを望まなかった場合は、出力-1。
サンプル入力
5
02120
サンプル出力
1
サンプルの説明
2は、0、1、2、ロックが開きますので、連続した4つの数字がある場合最初の2つのデジタル切り替え後は、デジタルロック20120です。
#include <iostream>
#include <set>
#include <queue>
using namespace std;
int num_swap;
set<string> states;
queue<string> pool;
int unLock()
{
string Lock;
while (pool.size() > 0)
{
queue<string> next_states;
num_swap++;
while (pool.size() > 0)
{
Lock = pool.front();
pool.pop();
if (Lock.find("2012") != string::npos)
return 1;
for (int i = 0; i <= Lock.length() - 2; ++i)
{
swap(Lock[i], Lock[i+1]);
if (states.find(Lock) == states.end())
{
states.insert(Lock);
next_states.push(Lock);
}
swap(Lock[i], Lock[i+1]);
}
}
pool = next_states;
next_states.empty();
}
return 0;
}
int main()
{
int N;
string Lock;
cin >> N;
cin >> Lock;
num_swap = -1;
states.insert(Lock);
pool.push(Lock);
if (unLock())
printf("%d", num_swap);
else
printf("-1");
return 0;
}