1 条题解

  • -1
    @ 2024-1-29 15:10:44
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    bool st[N]; //标记某个数有没有出现过 
    int a[N],b[N];
    int main()
    {
        int n,k;
        cin>>n>>k;
        queue<int> q;
        q.push(n); //起点入队 
        st[n]=1;
        int cnt=1; //不同的数的个数 
        for(int i=1;i<=k;i++)
        {
            cin>>a[i]>>b[i];
        } 
        while(q.size()) //如果元素还没有扩展完就一直扩展 
        {
            int t=q.front();
            q.pop();
            int tx=t; //临时元素 
            int p=1; //当前位置的权重 
            while(tx)
            {
                int ge=tx%10; //当前各位 
                tx/=10; //删除当前个位 
                for(int i=1;i<=k;i++) //枚举规则 
                {
                    if(a[i]==ge) //符合规则 
                    {
                        int cur=t+(b[i]-a[i])*p; //计算t由第i个规则可以得到的元素 
                        if(st[cur]==0) //当前元素还没有扩展 
                        {
                            q.push(cur); //加入待扩展元素 
                            st[cur]=1;
                            cnt++; //元素增加一个 
                        }
                    }
                }
                p=p*10; //下一位的权重 
            }
        }
        cout<<cnt;
        return 0;
    }
    
    • 1

    信息

    ID
    293
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    23
    已通过
    5
    上传者