题目(类似产生数):
•给出一个整数n(n<=2000)和k个变换规则(k<=10),规则:
①1个数字可以变换成另一个数字;
②规则中,右边的数字不能为0.
规则中不会有两个不同的数变为一个数,也不会有一个数变为两个不同的数。
例如:n=234,k=2,规则为:
2 to 5
3 to 6
上面的整数234,经过变换后可能产生出的整数为234、534、264、564。
求经过任意次的变换后,能产生多少个不同的整数。仅要求输出不同整数的个数
当使用一条规则时,字符串中符合条件的字母都必须同时转换,而不能选择性转换。
比如:
111
1
1 2
只能得到两个结果:111和222。而不能得到112,122等数。
求助大佬哪里错了,45 分……
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
string a, b;
map <string, bool> vis;
int k, x[15], y[15], ans;
string sub(string str, int a, int b) {
for (int i = 0; i < str.length(); i++)
if (str[i] - '0' == a) str[i] = b + '0';
return str;
} // 将字符串 str 的字符 a 全部替换成字符 b
void dfs(string s, int cnt) { // 当前到了第 cnt 个变换规则
if (!vis[s]) ans++;
if (cnt > k) return;
vis[s] = 1;
dfs(sub(s, x[cnt], y[cnt]), cnt + 1);
dfs(s, cnt + 1);
}
int main() {
cin >> a >> k;
for (int i = 1; i <= k; i++)
cin >> x[i] >> y[i];
dfs(a, 1);
cout << ans << endl;
return 0;
}