BFS搜索,为了保证算法能停下来要设置visit数组保存遍历过的顺序。
用结构体记录现在的顺序以及交换过多少次。

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

struct code{
    string str;
    int time;
    code(){}
    code(string s,int t):str(s),time(t) {}
};

vector<string> visit;

int find(vector<string> visit,code c){
    for(int i=0;i<visit.size();i++)
        if(c.str==visit[i])
            return i;
    return -1;
}

int BFS(code c){
    int count=0;
    queue<code> q;
    q.push(c);
    while(!q.empty()){
        if(find(visit,q.front())!=-1){
            q.pop();
            continue;
        }
        if(q.front().str.find("2012")!=-1)
            return q.front().time;
        else{
            code current=q.front();
            visit.push_back(current.str);
            q.pop();
            for(int i=0;i<current.str.size()-1;i++){
                code temp=current;
                swap(temp.str[i],temp.str[i+1]);
                temp.time++;
                q.push(temp);
            }
        }
    }
    return -1;
}

int main(){
    int n;
    string str;
    while(cin>>n){
        cin>>str;
        visit.clear();
        code c(str,0);
        cout<<BFS(c)<<endl;
    }
}