题解 | #玛雅人的密码#

玛雅人的密码

https://www.nowcoder.com/practice/761fc1e2f03742c2aa929c19ba96dbb0

//BFS宽度优先搜索
#include <iostream>
#include <string>
#include <queue>
#include <map>
using namespace std;

struct strtype{
    string value;
    int num;
    strtype(string s,int n):value(s),num(n){}
};
queue<strtype> myqueue;
map<string ,bool> mymap;
int BFS(int n){
    while(!myqueue.empty()){
        strtype current=myqueue.front();
        myqueue.pop();
        //如果当前值匹配2012,返回其对应的交换次数
        if(current.value.find("2012")!=string::npos){
            return current.num;
        }
        //未匹配,就把新一轮交换的放进队列里
        string str=current.value;
        int num=current.num;
        string temp;
        for(int i=0;i<n-1;i++){
            temp=str;
            char c=temp[i];
            temp[i]=temp[i+1];
            temp[i+1]=c;
            if(mymap.find(temp)!=mymap.end()){//如果已经匹配过这个字符串了
                continue;
            }
            else{//未匹配过的就标记一下,并且放进队列里
                mymap[temp]=true;
                myqueue.push(strtype(temp,num+1));
            }
        }
    }
    return -1;
}
int main() {
    int n;
    while(cin>>n){
        mymap.clear();
        myqueue=queue<strtype>();
        string str;
        cin>>str;
        myqueue.push(strtype(str,0));
        mymap[str]=true;
        cout<<BFS(n)<<endl;
    }
    return 0;
}

全部评论

相关推荐

1个小白:可以考虑投一下字节
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务