广度优先搜索,通过搜索状态结构体记录每一层的移动次数

#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
struct status {
    string code;
    int moveTime;
    status(string s, int i) {
        code = s;
        moveTime = i;
    }
};
int main() {
    int n;
    string s;
    while (cin >> n >> s) { // 注意 while 处理多个 case
        // cout << a + b << endl;
        queue<status> myQueue;
        unordered_map<string, bool> myMap;
        int searchTime = -1;
        myQueue.push(status(s, 0));
        myMap.insert(make_pair(s, true));
        while (!myQueue.empty()) {
            status current = myQueue.front();
            myQueue.pop();
            if (current.code.find("2012") != string::npos) {
                searchTime = current.moveTime;
                break;
            }
            for (int i=0;i <= current.code.size() - 2; i++) {
                string temp = current.code;
                swap(temp[i], temp[i + 1]);
                if (myMap.find(temp) == myMap.end()) {
                    myMap[temp] = true;
                    myQueue.push(status(temp, current.moveTime + 1));
                }
            }

        }
        cout<<searchTime<<endl;
    }
}
// 64 位输出请用 printf("%lld")