题目链接:uva 10981 - String Morphing
题目大意:给出一个规则,表示由两个字符可以变成一个字符(题目中的表),然后给出一个字符串A,问如何同过规则变换得到B串,输出过程。
解题思路:记忆化搜索,每次枚举当前串可以变换的位置,然后记录下来,用map映射设,有个剪枝就是找到B串就可以结束搜索了。然后在从B串回溯输出答案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <map>
using namespace std;
map<string, string> v;
string s, e;
inline char cat (char a, char b) {
if (a == 'a') {
if (b == 'c') return 'a';
return 'b';
} else if (a == 'b') {
return 'c' - b + 'a';
} else {
if (b == 'a') return 'a';
return 'c';
}
}
bool dfs(string c) {
int len = c.length();
if (len == 1)
return c == e;
for (int i = 1; i < len; i++) {
string tmp = "";
for (int j = 0; j < i-1; j++)
tmp = tmp + c[j];
tmp = tmp + cat(c[i-1], c[i]);
for (int j = i + 1; j < len; j++)
tmp = tmp + c[j];
if (v.count(tmp))
continue;
v[tmp] = c;
if (dfs(tmp))
return true;
}
return false;
}
void put(string c) {
if (c != s)
put(v[c]);
cout << c << endl;
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
cin >> s >> e;
v.clear();
if (dfs(s))
put(e);
else
printf("None exist!\n");
if (cas)
printf("\n");
}
return 0;
}