产生数

给出一个整数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;
}
追求吾之所爱
原文地址:https://www.cnblogs.com/rstz/p/12393217.html