产生数变题 45 分,求助大佬
  • 板块学术版
  • 楼主liuzimingc
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/7/30 15:28
  • 上次更新2023/11/4 12:39:41
查看原帖
产生数变题 45 分,求助大佬
421781
liuzimingc楼主2021/7/30 15:28

题目(类似产生数):

•给出一个整数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等数。

求助大佬哪里错了,4545 分……

#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;
}
2021/7/30 15:28
加载中...