【蓝桥杯】算法提高 产生数

问题描述

资源限制
  时间限制:1.0s 内存限制:256.0MB  
问题描述
  给出一个整数  n ( n<10^30) 和k个变换规则(k<=15)。
  规则:
  (1)1位数可变换成另一个一位数;
  (2)规则的右部不能为0。
  例如:n=234,有规则(k=2):
  2 → 5
  3 → 6
  上面的整数234经过变换后可能产生出的整数为(包括原数):234、534、264、564共4 种不同的产生数,求经过任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。

输入格式  
  n
  k
  x1 y1
  x2 y2
  … …
  xn yn
输出格式  
  格式为一个整数(满足条件的整数个数)。

样例输入

234
2
2 5
3 6

样例输出

4

解题思路

1、题目给定可以将一位数换成另一个一位数,且可以进行任意次交换,因此当给定2->5,5->8时,即意味着2-> 8。
  2、当有多位数字交换时,例如2->5,3->6 中,原数字的2可以表示为2或者5,原数字的3可以表示为3或者6,二者任意搭配,得到有2 X 2=4种结果;同理,当2->5,3->6 ,5->8时,原数字中的2可以表示为2、5或者8,原数字的3可以表示为3或者6,任意搭配可以得到3 X 2=6种结果。因此需要求出每一个可替换的数字(例如2)可以表示为多少个数字(例如2,5,8),计算乘积即可。
  3、计算时需要判断给出可转换的数字是否存在于原数字中。

解题代码

#include<iostream>
#include<string>
using namespace std;
struct node
{
    char a;
    char b;
};
int main ()
{
    string n;
    cin>>n;
    int k,count=0,res=1;
    cin>>k;
    node no[15];
    int cnt=0;
    for( cnt=0;cnt<k;cnt++) 
       cin>>no[cnt].a>>no[cnt].b; 
    //增加间接关联的数字,并统计每一数字可转换的其他数字个数 
    int d[11]={0};//统计可转换数字的个数
    for(int i=0;i<k;i++)
    {
        d[no[i].a-'0']++;
        for(int j=i+1;j<k;j++)
            if(no[i].b==no[j].a&&no[i].a!=no[j].b)
            {   
               //可省略接下来三行
               no[cnt].a=no[i].a ;
               no[cnt].b=no[j].b;
               cnt++; 
               d[no[i].a-'0']++;
              }  
      }
      //增加完毕
      //此时d[i]统计的为输入的转换个数,未包括i本身,因此+1
       for(int i=0;i<n.length();i++)
           for(int j=0;j<11;j++)
               if(n[i]-'0'==j&&d[j]) 
                     res*=d[j]+1;  
       cout<<res;
       return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值