题解 | #玛雅人的密码#

玛雅人的密码

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;
}
全部评论

相关推荐

勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务