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