【题目描述】
给出一个整数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; }