题解 | 小红的数位删除

小红的数位删除

https://www.nowcoder.com/practice/a1044c31930341d6a51c9a619254074a

通过位运算状态压缩解题和bfs搜索都是可行的,这里使用bfs

#include<bits/stdc++.h>
using namespace std;

struct State
{
    string sa;
    string sb;
    int steps;
};

bool check(string sa, string sb)
{
    if(sa.size()!=0 && sb.size()!=0)//由于stoll,空串会异常,所以我们先检查后转换。
    {
        long long a = stoll(sa),b= stoll(sb);
        return (a%b==0 || b%a==0);
    }
    else return false;
}

int bfs(int a,int b)
{
    queue<State> q;//队列FIFO那么最先压入的应该是我们steps==1的情况,依次类推
    q.push({to_string(a),to_string(b),0});//初始化

    set<pair<string,string>> visited;//用set去重,减少重算
    visited.insert({to_string(a),to_string(b)});
    while(q.size()!=0)
    {
        State current = q.front();
        q.pop();
        if(check(current.sa,current.sb))
        {
            return current.steps;
        }
        for(int i = 0; i < current.sa.length(); i++)
        {
            string next_a = current.sa.substr(0, i) + current.sa.substr(i + 1);
            if (visited.find({next_a, current.sb}) == visited.end()) 
            {
                visited.insert({next_a, current.sb});
                q.push({next_a, current.sb, current.steps + 1});
            }
        }
        for (int i = 0; i < current.sb.length(); i++) 
        {
            string next_b = current.sb.substr(0, i) + current.sb.substr(i + 1);
            if (visited.find({current.sa, next_b}) == visited.end()) 
            {
                visited.insert({current.sa, next_b});
                q.push({current.sa, next_b, current.steps + 1});
            }
        }
    }
    return -1;//如果列表清空仍然没有返回步数说明无法实现
}


int main()
{
    int a,b;
    cin >> a >> b;
    if(a%b==0 || b%a==0)
    {
        cout << 0 << endl;
        return 0; 
    }
    else cout << bfs(a,b) << endl;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 17:04
点赞 评论 收藏
分享
当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务