【题目描述】
给出一个整数n(n≤2000)和k个变换规则(k≤15)。规则:
① 1个数字可以变换成另1个数字;
② 规则中,右边的数字不能为零。
例如:n=234,k=2规则为
2 → 5
3 → 6
上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。
求经过任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。
【输入】
nkx1x2…xny1y2…yn
【输出】
格式为一个整数(满足条件的整数个数)。
【输入样例】
234
2
2 5
3 6
【输出样例】
4
#include
using namespace std;
int n, k, ans = 1;
pair<int, int> p[20]; //存储变换规则
vector<int> v; //存储n这个数的每一位
int vis[10010]; //标记某个数是否出现过
//把n的每一位数字存储在v中
void init(int n) {
while (n != 0) {
v.push_back(n % 10);
n /= 10;
}
std::reverse(v.begin(), v.end());
}
//把vis数组转化为数字
int generate() {
int res = 0;
for (int i = 0; i < v.size(); ++i) {
res = res * 10 + v[i];
}
return res;
}
void dfs() {
for (int i = 0; i < v.size(); ++i) {
for (int j = 0; j < k; ++j) {
if (v[i] == p[j].first) {
//当前位满足替换
v[i] = p[j].second;
int newNum = generate();
if (!vis[newNum]) {
//新数字
vis[newNum] = 1;
ans++;
dfs();
}
//还原回来
v[i] = p[j].first;
}
}
}
}
int main() {
cin.tie(0);
cin >> n >> k;
init(n);
for (int i = 0; i < k; ++i) {
cin >> p[i].first;
cin >> p[i].second;
}
//不能忘把本身标记一下
vis[n] = 1;
dfs();
cout << ans;
return 0;
}
#include
using namespace std;
int n, k, ans = 1;
pair<int, int> p[20]; //存储变换规则
vector<int> v; //存储n这个数的每一位
int vis[10010]; //标记某个数是否出现过
queue<int> q;
//把n的每一位数字存储在v中
void init(int n) {
//记得清一下,不然上次的数字也在
v.clear();
while (n != 0) {
v.push_back(n % 10);
n /= 10;
}
std::reverse(v.begin(), v.end());
}
//把vis数组转化为数字
int generate() {
int res = 0;
for (int i = 0; i < v.size(); ++i) {
res = res * 10 + v[i];
}
return res;
}
void bfs() {
q.push(n);
while (!q.empty()) {
int num = q.front();
init(num);
q.pop();
for (int i = 0; i < v.size(); ++i) {
for (int j = 0; j < k; ++j) {
if (v[i] == p[j].first) {
//当前位满足替换
v[i] = p[j].second;
int newNum = generate();
if (!vis[newNum]) {
//新数字
vis[newNum] = 1;
q.push(newNum);
ans++;
}
//还原回来
v[i] = p[j].first;
}
}
}
}
}
int main() {
cin.tie(0);
cin >> n >> k;
init(n);
for (int i = 0; i < k; ++i) {
cin >> p[i].first;
cin >> p[i].second;
}
//不能忘把本身标记一下
vis[n] = 1;
bfs();
cout << ans;
return 0;
}