• luogu P1037 产生数 x


    P1037 产生数

    题目描述

    给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。

    规则:

    一位数可变换成另一个一位数:

    规则的右部不能为零。

    例如:n=234。有规则(k=2):

    2->5

    3->6

    上面的整数 234 经过变换后可能产生出的整数为(包括原数):

    234 534 264 564 共 4 种不同的产生数

    问题:

    给出一个整数 n 和 k 个规则。

    求出:

    经过任意次的变换(0次或多次),能产生出多少个不同整数。

    仅要求输出个数。

    输入输出格式

    输入格式:

    键盘输人,格式为:

    n k x1 y1 x2 y2 ... ...

    xn yn

    输出格式:

    屏幕输出,格式为:

    一个整数(满足条件的个数):

    输入输出样例

    输入样例#1:
    234 2
    2 5
    3 6
    
    输出样例#1:
    4

    思路:

      这道题将真有点floyed的意味2333,然后就是坑点辣~

    坑点:

      看到数据后懵了一会,为什么我的出负数?!!哦!爆long long辣!所以要用高精来做!

    代码:

    #include<iostream>
    
    using namespace std;
    
    string n;
    int k,can[10][10];
    int ans[500]={1};///必须将第一个的值赋值为1,不然会爆'0'!!! 
    int l=1,b[10];
    
    void work(int x)///高精乘法
    {
        for(int i=0; i<l; i++)
            ans[i]*=x;
        for(int i=0; i<l; i++)
            if(ans[i]>=10)
            {
                ans[i+1]+=ans[i]/10;
                ans[i]%=10;
            }
        while(ans[l]>0)
        {
            ans[l+1]=ans[l]/10;
            ans[l]=ans[l]%10;
            l++;
        }
    }
    
    int main()
    {
        cin>>n>>k;
        int x,y;
        while(k--)///k为可变换的数字有多少个
        {
            cin>>x>>y;
            can[x][y]=1;///can数组进行标记,即x可以变换为y
        }
        for(int v=0; v<10; v++)
            for(int j=0; j<10; j++)
                for(int i=0; i<10; i++)
                    if(i!=j&&j!=v&&i!=v)///排除x变为x的情况,必须保证让x变为不同的数字
                        if(can[i][v]==1&&can[v][j]==1) can[i][j]=1;
        /*
        如果i可以变换成v,并且v还可以变成j的话,那么,i也可以变为j
        */
        int len=n.length();
        for(int i=0; i<len; i++)
        {
            int n1=n[i]-'0',change=1;///n1进行转换,将字符串形式的转换为int形式
            for(int j=0; j<10; j++)
            if(can[n1][j]==1&&n1!=j)///如果当前数字可以进行转换,记录下来,即change++
                change++;
            b[n1]=change;///记录下来 
        }
        for(int i=0; i<len; i++) work(b[n[i]-'0']);
        for(int i=l-1; i>=0; i--) cout<<ans[i];
        return 0;
    }
    View Code

    End.

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    android技能树
    BitmapFactory 读取图片方法总结
    如何利用SecureCRT连接Ubuntu12.0.4
    Ubuntu 12.04如何从登录界面登录root
    ubuntu中vi在编辑状态下方向键不能用的解决
    在ubuntu12.0.4上搭建samba服务器以实现文件共享
    怎么利用ultraISO对一个文件夹制作ISO镜像
    VMware网络选项分析
    在vmware 6.5+ubuntu12.04上安装VMware tools出现问题的分析
    在ubuntu中获得root权限
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7060506.html
Copyright © 2020-2023  润新知