【递归】产生数

问题 E: 【递归与递推】产生数

题目描述

 给出一个整数n(n<1030)和m个变换规则(m≤20)。

约定:一个数字可以变换成另一个数字,规则的右部不能为零,即零不能由另一个数字变换而成。而这里所说的一个数字就是指一个一位数。

现在给出一个整数n和m个规则,要你求出对n的每一位数字经过任意次的变换(0次或多次),能产生出多少个不同的整数。


输入

共m+2行,第一行是一个不超过30位的整数n,第2行是一个正整数m,接下来的m行是m个变换规则,每一规则是两个数字x、y,中间用一个空格间隔,表示x可以变换成y。

输出

仅一行,表示可以产生的不同整数的个数。

样例输入

1 2 3
2
1 2
2 3

样例输出

6
#include <iostream>
#include <cstring>
#include <cstdio>
 
using namespace std;
int a[35],n,x,y,f[10];
bool g[11][11];
char s[65];
void init() {
    for(int i = 0; i <= 9; i++) {
            f[i]= 0;
        for(int j = 0; j <= 9; j++) {
         if(i != j)   g[i][j] = false;
         else g[i][j] = true;
        }
    }
}
void floyd() {
    for (int k = 0; k <= 9; k++) {
        for (int i = 0; i <= 9; i++) {
            for(int j = 0; j<=9; j++) {
            if(g[i][k] && g[k][j]) g[i][j] =  true;
            }
        }
 
    }
 
}
int slove(){
    for(int i = 0; i <=9; i++){
        for(int j = 0; j<=9; j++){
            if(g[i][j]) f[i]++;
        }
    }
    int sum  = 1;
    int len = strlen(s);
    for(int i = 0; i < len; i++){
        if(s[i] == ' ') continue;
        else
        {
            sum *= f[s[i]-'0'];
        }
    }
    return sum;
}
int main() {
    init();
    gets(s);
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d%d", &x, &y);
        g[x][y] = true;
    }
    floyd();
    printf("%d\n",slove());
    return 0;
}
View Code

 

posted on 2016-07-04 21:55  disppr  阅读(248)  评论(0编辑  收藏  举报