玛雅人有一种密码,如果字符串中出现连续的 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 <bits/stdc++.h>
using namespace std;
int main() {
int n = 0;
string s = "";
cin >> n >> s;
queue<string> q;
unordered_map<string, int> 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;
}