BFS广搜即可
代码:
#include<iostream>
#include<set>
#include<queue>
using namespace std;
int n;
//检查是否含有2012
int check(string& s){
for(int i=0;i<=n-4;++i) if(s.substr(i,4)=="2012") return 1;
return 0;
}
//相邻位置交换
void change(string& s,set<string>&ss,queue<string>& q){
char tp;
for(int i=1;i<n;++i){
string t(s);
tp=t[i],t[i]=t[i-1],t[i-1]=tp;
if(!ss.count(t)) ss.emplace(t),q.emplace(t);
}
}
int main(){
ios::sync_with_stdio(false);
string str;
while(cin>>n){
cin>>str;
int a[3]={0,0,0};
for(int i=0;i<n;++i) a[str[i]-'0']++;
//不可能出现2012
if(!a[0]||!a[1]||a[2]<2){
cout<<-1<<endl;
continue;
}
queue<string>q;
set<string>s;
q.emplace(str);
s.emplace(str);
int cnt=0;
string t;
//BFS扩展
while(!q.empty()){
int len=q.size();
bool f=false;
for(int i=0;i<len;++i){
t=q.front(); q.pop();
if(check(t)){
f=true; break;
}
change(t,s,q);
}
if(f){
cout<<cnt<<endl;
break;
}
++cnt;
}
}
return 0;
}