给出一个整数 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=234。有规则(k=2):
2-> 5
3-> 6
上面的整数 234 经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共 4 种不同的产生数
问题:
给出一个整数 n 和 k 个规则。
求出:
经过任意次的变换(0次或多次),能产生出多少个不同整数。
仅要求输出个数。
键盘输人,格式为:
n k
x1 y1
x2 y2
... ...
xn yn
n k
x1 y1
x2 y2
... ...
xn yn
屏幕输出,格式为:
一个整数(满足条件的个数)
一个整数(满足条件的个数)
234 2
2 5
3 6
4
基本思想:利用Floy判断节点可以到达那些节点,然后利用乘法原理计算
上代码:
#include<stdio.h>
#include<string.h>
int e[20][20];
int n,k;
int num[11];
int main()
{
int i,u,v;
char s[100];
for(i=0;i<=9;i++) num[i]++;
scanf("%s",s);
scanf("%d",&k);
for(i=1;i<=k;i++)
{
scanf("%d %d",&u,&v);
e[u][v]=1;
}
for(i=0;i<=9;i++)
{
for(u=0;u<=9;u++)
{
for(v=0;v<=9;v++)
{
if(e[u][i]&&e[i][v])
{
e[u][v]=1;
}
}
}
}
for(i=0;i<=9;i++)
{
for(u=0;u<=9;u++)
if(e[i][u]) num[i]++;
}
long long re=1;
for(i=0;i<strlen(s);i++)
{
re*=num[((int)s[i]-48)];
}
printf("%lld",re);
return 0;
}