玛雅人有一种密码,如果字符串中出现连续的 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
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;
- }