【递归】产生数

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

时间: 2024-12-19 07:45:15

【递归】产生数的相关文章

python:递归将一个数逆序列放入列表中

接上回:将一个数逆序列放入列表中,例如1234 => [4,3,2,1].要求用递归实现.不允许使用str和map,那就直接用除法和取模来做: lst = [] def int_to_list(tmp:int): division_number = tmp / 10 demo_number = tmp % 10 tmp3 = division_number - demo_number / 10 if tmp3: int_to_list(int(tmp3)) lst.append(demo_num

递归思想即背包问题

01背包问题: 1.递归思想 0- 1 背包问题如果采用递归算法来描述则非常清楚明白, 它的算法根本思想是假设用布尔函数 knap( s, n) 表示n 件物品放入可容质量为s 的背包中是否有解( 当knap 函数的值为真时 说明问题有解,其值为假时无解) . 我们可以通过输入s 和n 的值, 根据它们的值可分为以下几种情况讨论: ( 1) 当s= 0时可知问题有解, 即函数knap( s, n) 的值为true; ( 2) 当s< 0 时这时不可能, 所以函数值为false; ( 3) 当输入

Linux Fork Bomb

众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序进行 模块化的高效开发与管理.于是产生了由于其特殊的特性,bash拥有了fork炸弹.Jaromil在2002年设计了最为精简的一个fork炸弹的实 现. 所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏.fork炸 弹实质是一个简单的递归程序.由于程序是递归的,如果没有任何限

Oracle异常汇总

持续更新中,可参见https://hnuhell.gitbooks.io/oracle_errmg/content/或https://hnuhell.github.io/Oracle_ERRMG/上的页面. ORA-00000 to ORA-00877 ORA-00000: 正常的成功的完成(操作) ORA-00000: normal, successful completion 原因1: 正常执行完成.[部分验证] Normal exit. 分析: 此异常多数为程序没有执行SQL语句或者说成功

算法笔记_113:算法集训之代码填空题集一(Java)

 目录 1 报数游戏 2 不连续处断开 3 猜数字游戏 4 串的反转 5 串中找数字 6 递归连续数 7 复制网站内容 8 股票的风险 9 基因牛的繁殖 10 括号的匹配   1 报数游戏 有n个孩子站成一圈,从第一个孩子开始顺时针方向报数,报到3的人出列,下一个人继续从1报数,直到最后剩下一个孩子为止.问剩下第几个孩子.下面的程序以10个孩子为例,模拟了这个过程,请完善之(提示:报数的过程被与之逻辑等价的更容易操作的过程所代替). Vector a = new Vector(); for(in

ACM 算法实现

实验一 统计数字问题 1.问题描述:一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如,第6 页用数字6 表示,而不是06 或006 等.数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9.2.题目分析:考虑由0,1,2,…,9组成的所有n位数.从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为. 满足如下递归式:由此可知,.据此,可从低位向高位进行

算法设计之0-1背包问题

1.题目分析: 考虑到每种物品只有2 种选择,即装入背包或不装入背包,并且物品数和背包容量已给定,要计算装入背包物品的最大价值和最优装入方案,可用回溯法搜索子集树的算法进行求解. 2.算法设计:a. 物品有n种,背包容量为C,分别用p[i]和w[i]存储第i种物品的价值和重量,用x[i]标记第i种物品是否装入背包,用bestx[i]存储第i种物品的最优装载方案:b. 用递归函数Backtrack (i,cp,cw)来实现回溯法搜索子集树(形式参数i表示递归深度,n用来控制递归深度,形式参数cp和

HDU 1016 Prime Ring Problem --- 经典DFS

思路:第一个数填1,以后每个数判断该数和前一个数想加是否为素数,是则填,然后标记,近一步递归求解. 然后记得回溯,继续判断下一个和前一个数之和为素数的数. /* HDU 1016 Prime Ring Problem --- 经典DFS */ #include <cstdio> #include <cstring> int n; bool primer[45], visit[25]; //primer打素数表,visit标记是否访问 int a[25]; //数组a存储放置的数 /

Singapore NOI2012 MODSUM题解

MODSUM(modsum.pas/c/cpp) [问题描述] 在本题中,你得到了一个含有n个参数的函数f: f(x1,…,x2)=(((x1+x2+…+xn)4+2*(x1+x2+…+xn)2) mod 5)+1 为了避免出现争议,函数f只接受整数参数.你的任务是计算f的所有函数值的和,每个参数xi是从vi到wi之间的整数.也就是说,你需要计算 例如,如果n=3,v1=2,w1=3.v2=10,w2=12,v3=17,w3=17,那么这个结果应该是19.因为f(2,10,17) = 4, f(

算法导论_第十六章_动态规划_creatshare分享会

动态规划 注:该篇为本人原创,转载请注明出处:http://blog.csdn.net/chudongfang2015/article/details/51590817--开心 -.- 个人对动态规划的理解: 1.动态规划是一个付出额外空间来节省时间,就是所谓的空间换时间. 2.动态规划储存每个状态的最优解. 3.动态规划是用来把子问题的结果储存下来,再次用到的时候就不必再进行重复计算. 算法导论对动态规划的解释: 动态规划和分治方法相似,都是通过组合子问题的解来求解原问题,分治方法将问题划分为