问题描述
资源限制
时间限制: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;
}