产生数

【题目描述】

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

(1)一位数可变换成另一个一位数;

(2)规则的右部不能为零;

例如: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

【输出描述】

输出格式为一个整数(满足条件的个数)。

【样例输入】

234 2

2 5

3 6

【样例输出】

4

源代码:

#include<cstdio>
#include<cstring>
int k,num(0),Ans[31],i[10]={0};
bool f[10][10]={0},F[10];
char S[31];
void DFS(int t,int T)
{
    for (int a=1;a<10;a++)
      if (f[t][a]&&!F[a])
      {
          i[T]++;
          F[a]=true;
          DFS(a,T);
      }
}
void X(int t) //高精度依旧毒香四溢。
{
    int K(0);
    for (int a=0;a<=num;a++)
    {
        int T=K;
        K=(Ans[a]*t+T)/10;
        Ans[a]=(Ans[a]*t+T)%10;
    }
    while (K)
    {
        Ans[++num]=K%10;
        K/=10;
    }
}
int main() //水水水。
{
    scanf("%s%d",S,&k);
    for (int a=0;a<k;a++)
    {
        int T1,T2;
        scanf("%d%d",&T1,&T2);
        f[T1][T2]=true;
    }
    for (int a=0;a<10;a++)
    {
        memset(F,false,sizeof(F));
        i[a]++;
        F[a]=true;
          for (int b=1;b<10;b++)
          if (f[a][b]&&!F[b]) //知道真相的我眼泪掉下来。
          {
            i[a]++;
            F[b]=true;
              DFS(b,a);
          }
    }
    int Length=strlen(S);
    Ans[0]=1;
    for (int a=0;a<Length;a++)
      X(i[S[a]-'0']);
    for (int a=num;a>=0;a--)
      printf("%d",Ans[a]);
    return 0;
}

转载于:https://www.cnblogs.com/Ackermann/p/5798528.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值