题解 | #玛雅人的密码#
玛雅人的密码
http://www.nowcoder.com/practice/761fc1e2f03742c2aa929c19ba96dbb0
简单易懂bfs,宝宝也能学会~
#include<bits/stdc++.h>
using namespace std;
struct str{
int count; //记录移动次数(为什么要加?答:因为bfs队列一直在循环,不清楚排队的兄弟经过了几次字符移动)
string s;
};
bool check(string s){
if(s.find("2012")!=string::npos) return true;
else return false;
}
int fact(int l){
if(l==0) return 1;
else return l*fact(l-1);
}
queue<str> q;
int _count=-1;
void bfs(str s,int len){
q.push(s);
int flag=0; //记录排队数,全排列后还没跳出,说明无解,撤退之
//BFS主体
while(!q.empty()){
if(flag++>fact(len)) return;
//取队首检查之
str temp=q.front();
q.pop();
if(check(temp.s)==true){
_count=temp.count;
return;
}
//字符移动并入队
for(int i=0;i<len-1;i++){
swap(temp.s[i],temp.s[i+1]);
q.push({temp.count+1,temp.s});
swap(temp.s[i],temp.s[i+1]);
}
}
}
int main(){
int len;
cin>>len;
str _str;
cin>>_str.s;
_str.count=0;
bfs(_str,len);
cout<<_count<<endl;
system("pause");
return 0;
}