题解 | 密码锁

#include <bits/stdc++.h>

using namespace std;
typedef struct node{//定义每一种排列的结构体
    int count;
    string str;
    node(int x, string str):count(x),str(str){};
};

using namespace std;
int bfs(string str){
    map<string,bool> m;//定义map记录已出现过的字符串节点
    queue<node> q;
    node temp =  node(0,str);
    q.push(temp);
    m[str]=true;
    while(!q.empty()){
        node first = q.front();
        q.pop();
        string firStr = first.str;
        if(firStr.find("2012")!=firStr.npos){
            return first.count;
        }
        for(int i=0;i<firStr.length()-1;i++){//交换字符
            string str2 = firStr;
            swap(str2[i],str2[i+1]);
            if(m.find(str2)!=m.end()&&m[str2]==true);//已出现过则跳过
            else{//否则入队
                node second = node(first.count+1, str2);
                q.push(second);
                m[str2]=true;
            }
        }
    }
    return -1;
}

int main(){
    int n;
    string str;
    while(cin>>n>>str){
        cout<<bfs(str)<<endl;
    }
}

广搜,学习了评论区的思路,这里的内存很容易爆,数据量极大,因此,我们必须考虑用map辅助存储,否则一定会爆内存。

全部评论

相关推荐

2024-12-22 15:59
华中科技大学 C++
南瑞继保 软件开发 30w左右
点赞 评论 收藏
分享
2024-12-31 16:30
已编辑
门头沟学院 C++
字节 游戏后端 n*15 本科其他
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务