给出一个整数n (n < 103)和k个变换规则(
k≤15)。
规则:
- -位数可变换成另一个位数:规则的右部不能
为零。
例如: n= 234。有规则(k= 2) :
2→5
3→6
上面的整数234经过变换后可能产生出的整数
为(包括原数) :
234
534
264
564
共4种不同的产生数
问题:给出一个整数n和k个规则。
求出:经过任意次的变换(0 次或多次),能产
生出多少个不同整数。仅要求输出个数。
输入格式
输入格式为:
nk
21Y1.
X2 Y2
… …
Xn Yn
输出格式
一个整数 (满足条件的个数)。
样例输入
234 2
25
36
样例输出
4
思路:计算每个位置上的数字能有多少种方案,然后把所有的数字乘起来就是答案了。
#include <iostream>
#include <cstring>
using namespace std;
bool op[10][10];
string str;
int vis[10];
int value[32], ss;
int maxlen = 1;
void dfs(int a)
{
if (vis[a])
return;
vis[a] = true;
ss++;
for ( int i = 0;i <= 9; ++i)
{
if (op[a][i])
dfs(i);
}
}
void multiple(int x)
{
int carry = 0;
for (int i = 1; i <= maxlen; ++i)
{
value[i] = value[i] * x + carry;
carry = value[i] / 10;
value[i] %= 10;
}
while (carry)
{
value[++maxlen] = carry % 10;
carry /= 10;
}
return;
}
int main()
{
int n, m , i, j, k;
int s;
value[1] = 1;
cin >> str >> k;
int a, b;
if ( k == 0)
{
cout << 1 << endl;
return 0;
}
while (k--)
{
cin >> a >> b;
op[a][b] = true;
}
int len = str.size();
for (i = 0; i < len; ++i)
{
memset(vis,0,sizeof(vis));
ss = 0;
dfs(str[i] - '0');
multiple(ss);
}
for (i = maxlen; i >= 1; i--)
{
cout << value[i];
}
cout << endl;
return 0;
}