Acwing3385. 玛雅人的密码

3385. 玛雅人的密码 - AcWing题库

玛雅人有一种密码,如果字符串中出现连续的 2012 四个数字就能解开密码。

给定一个长度为 N 的字符串,该字符串中只含有 0,1,2 三种数字。

可以对该字符串进行换位操作,每次操作可选取相邻的两个数字交换彼此位置。

请问这个字符串要换位几次才能解开密码。

例如 02120 经过一次换位,可以得到 20120,01220,02210,02102,其中 20120符合要求,因此输出为 1。

如果无论换位多少次都解不开密码,输出 −1。

输入格式

第一行包含一个整数 N,表示字符串的长度。

第二行包含一个由 0,1,2 组成的,长度为 N 的字符串。

输出格式

若可以解出密码,则输出最少的换位次数;否则输出 −1。

数据范围

2≤N≤13

输入样例:

5
02120

输出样例:

1

 思路:BFS,m[s]表示从原字符串到s字符串所需步数

#include 

using namespace std;

int main() {
    int n = 0;
    string s = "";
    cin >> n >> s;
    queue q;
    unordered_map m;
    
    q.push(s);
    m[s] = 0;
    
    while (!q.empty()) {
        auto t = q.front();
        q.pop();
        
        if (t.find("2012") != string::npos) {
            cout << m[t] << endl;
            return 0;
        }
        
        for (int i = 0; i < n - 1; i++) {
            string tmp = t;
            swap(tmp[i], tmp[i + 1]);
            if (!m.count(tmp)) {
                m[tmp] = m[t] + 1;
                q.push(tmp);
            }
        }
    }
    cout << -1 << endl;
    return 0;
}

 

你可能感兴趣的:(算法,数据结构,c++)