给出一个整数n(n<1030)和m个变换规则(m≤20)。
约定:一个数字可以变换成另一个数字,规则的右部不能为零,即零不能由另一个数字变换而成。而这里所说的一个数字就是指一个一位数。
现在给出一个整数n和m个规则,要你求出对n的每一位数字经过任意次的变换(0次或多次),能产生出多少个不同的整数。
标签:
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; }
标签:
原文地址:http://www.cnblogs.com/cshg/p/5641827.html