Codeforces Educational Codeforces Round 42 (Rated for Div. 2) C. Make a Square 打表+bfs (小心溢出)

点击打开链接

丑陋的代码:因为溢出问题被hack,很难受

    //打表 bfs
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int maxn=1e5;
    set<LL>s;
    string n;
    struct node{
    string k;
    int dist;
    node(string k,int dist):k(k),dist(dist) {}
    };
    LL field(string x)
    {
        LL sum=0;
        LL f=1;
        for(int i=0;i<x.length();i++)
            f*=10;
        f/=10;
        for(int i=0;i<x.length();i++)
        {
                sum+=f*(x[i]-'0');
                f/=10;
        }
        return sum;
    }
    int bfs()
    {
        queue<node>pq;
        while(!pq.empty()) pq.pop();
        pq.push(node(n,0));
        while(!pq.empty())
        {
            node p=pq.front();
            pq.pop();
            LL x=field(p.k);
            /*cout<<x<<endl;
            if(s.find(x)!=s.end()) {
                cout<<sqrt(x)<<endl;
            }*/
            if(s.find(x)!=s.end()) return p.dist;
            string z;
            z.clear();
            z=p.k;
            if(z.length()==1) continue;
            //cout<<z<<endl;
            for(int i=0;i<z.length();i++)           //依次选取要删除的字符
            {
                string y;
                y.clear();
                for(int j=0;j<z.length();j++)
                    if(j!=i) y+=z[j];
                //cout<<y<<endl;
                if(y[0]!='0') {
                    pq.push(node(y,p.dist+1));
                }
            }
        }
        return -1;
    }
    int main()
    {
        s.clear();
        for(LL i=1;i<=maxn;i++)
        {
            s.insert(LL(i*i));
        }
        getline(cin,n,'\n');
        cout<<bfs()<<endl;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值