码迷,mamicode.com
首页 > 其他好文 > 详细

【递归】产生数

时间:2016-07-04 23:30:25      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:

问题 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

 

【递归】产生数

标签:

原文地址:http://www.cnblogs.com/cshg/p/5641827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!