codevs 1009 产生数 Floyd 解题报告

来源:互联网 发布:matlab 内置函数源码 编辑:程序博客网 时间:2024/06/14 09:32

题目描述 Description

  给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。
  规则:
   一位数可变换成另一个一位数:
   规则的右部不能为零。
  例如:n=234。有规则(k=2):
    2-> 5
    3-> 6
上面的整数 234 经过变换后可能产生出的整数为(包括原数):
   234
   534
   264
   564
共 4 种不同的产生数
问题:

给出一个整数 n 和 k 个规则。

求出:
  

经过任意次的变换(0次或多次),能产生出多少个不同整数。   仅要求输出个数。

输入描述 Input Description

键盘输人,格式为:
  n k
  x1 y1
  x2 y2
  … …
  xn yn

输出描述 Output Description

屏幕输出,格式为:
一个整数(满足条件的个数)

样例输入 Sample Input

   234 2
   2 5
  3 6

样例输出 Sample Output

4

思路

可以转化的就连边。

代码

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=35;int dis[N][N],m,k,x,y,num=1;char n[N];long long ans=1;void floyd(){    for (int k=0;k<=9;k++)    for (int i=0;i<=9;i++)    for (int j=0;j<=9;j++)    if (i!=k&&i!=j&&k!=j)    if (dis[i][k]&&dis[k][j]) dis[i][j]=1;    return ;}int main(){    scanf("%s",n+1);    scanf("%d",&k);    int len=strlen(n+1);        for (int i=1;i<=k;i++)    {        scanf("%d%d",&x,&y);        dis[x][y]=1;    }    floyd();    for (int i=1;i<=len;i++)    {        int now=n[i]-'0',num=1;        for (int j=0;j<=9;j++)        if (now!=j&&dis[now][j]) num++;        ans*=num;    }    printf("%lld\n",ans);    return 0;}