玛雅人有一种密码,如果字符串中出现连续的 20122012 四个数字就能解开密码。
给定一个长度为 NN 的字符串,该字符串中只含有 0,1,20,1,2 三种数字。
可以对该字符串进行换位操作,每次操作可选取相邻的两个数字交换彼此位置。
请问这个字符串要换位几次才能解开密码。
例如 0212002120 经过一次换位,可以得到 20120,01220,02210,0210220120,01220,02210,02102,其中 2012020120 符合要求,因此输出为 11。
如果无论换位多少次都解不开密码,输出 −1−1。
输入格式
第一行包含一个整数 NN,表示字符串的长度。
第二行包含一个由 0,1,20,1,2 组成的,长度为 NN 的字符串。
输出格式
若可以解出密码,则输出最少的换位次数;否则输出 −1−1。
数据范围
2≤N≤132≤N≤13
输入样例:
5
02120
输出样例:
1
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
unordered_map<string, int> d, st;
int bfs(){
queue<string> q;
q.push(s);
d[s]=0;
st[s]=1;
while(q.size())
{
auto t=q.front();
q.pop();
if(t.find("2012") != -1) return d[t];
for(int i=1;i<t.size();i++)
{
string tt =t;
swap(tt[i-1],tt[i]);
if(!st[tt])
{
st[tt]=1;
q.push(tt);
d[tt]=d[t]+1;
}
}
}
return -1;
}
int main()
{
cin>>n;
cin>>s;
cout<<bfs()<<endl;
return 0;
}
标签:输出,玛雅人,NN,int,换位,密码,字符串 From: https://blog.csdn.net/qq_60510847/article/details/142924800