• 暴力BFS
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;

struct pass{
  string s;
  int x;//移动次数
  pass(string s,int x):s(s),x(x){}
};

int bfs(string s){
   pass first(s,0);
   queue<pass>myque;
   myque.push(first);//初始入队
   
   while(!myque.empty()){
     pass cur=myque.front();
     myque.pop();
     if(cur.s.find("2012")!=-1){//查找2012
       return cur.x;
     }
     for(int i=0;i<s.size()-1;i++){
       pass next(cur.s,cur.x+1);
       if(next.s[i]!=next.s[i+1]){//相同无需移动
         swap(next.s[i],next.s[i+1]);
         myque.push(next);
       }
     }
   }
    return -1;
}
 int main(){
   int n;
   string s;
   while(cin>>n>>s){
     int count1=0,count2=0,count0=0;
     for(int i=0;i<n;i++){//统计0、1、2出现次数 排除查找不到的可能
       if(s[i]=='0')count0++;
       else if(s[i]=='1')count1++;
       else if(s[i]=='2')count2++;
     }
     if(count0>=1&&count1>=1&&count2>=2)printf("%d\n",bfs(s));
     else printf("-1\n");
   }
   return 0;
 }
 
 

- 使用map避免重复入队

#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;

struct pass{
  string s;
  int x;
  pass(string s,int x):s(s),x(x){}
};

int bfs(string s){
   map<string,bool>visit;//
   pass first(s,0);
   queue<pass>myque;
   myque.push(first);
   visit[s]=true;//标记为已查找过
    
   while(!myque.empty()){
     pass cur=myque.front();
     myque.pop();
     if(cur.s.find("2012")!=-1){
       return cur.x;
     }
     for(int i=0;i<s.size()-1;i++){
       pass next(cur.s,cur.x+1);
       swap(next.s[i],next.s[i+1]);
       if(visit.find(next.s)==visit.end()){//未查找过则入队
           myque.push(next);
           visit[next.s]=true;//标记为已查找过
       }
     }
   }
    return -1;
}
 int main(){
   int n;
   string s;
   while(cin>>n>>s){
     printf("%d\n",bfs(s));
   }
   return 0;
 }