这题用dfs暴力能过,这里是参考大佬代码,用的双向广搜(正好早上在看这个知识点?)
#include<iostream>
#include<math.h>
#include<vector>         
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<unordered_map>
using namespace std;
const int N =2e5+10;
typedef long long ll;
typedef unordered_map<string, int> und;
string aq[7], bw[7];
int _1=0;
string a, b;
int replace_charctor(queue<string>& q, und& nowd, und& red, string now[], string re[])
{
	string s = q.front();
	q.pop();
	for (int i = 0;i < s.size();i++)//枚举当前字符的位置
	{
		for (int j = 0;j < _1;j++) {
			if (s.substr(i, now[j].size()) == now[j])
			{
				string str = s.substr(0, i) + re[j] + s.substr(i + now[j].size());//替换大法
				if (nowd.count(str))continue;//已经替换过了捏!这条路走过了
				if (red.count(str))return nowd[s] + 1 + red[str];//在反向队列里面出现过!返回
				nowd[str] = nowd[s] + 1;
				q.push(str);
			}

		}
	}
	return 99;
}
	int bfs()
	{
		und da, db;//绑定键值
		queue<string>qa, qb;
		int t;//答案捏
		qa.push(a);da[a] = 0;
		qb.push(b);db[b] = 0;
		while (!qa.empty() && !qb.empty())//一方为空说明该方向无法连通,无法拓展下层元素
		{
			if (qa.size() < qb.size())t = replace_charctor(qa, da, db, aq, bw);//这里是广搜的优化用状态少的一方进行拓展
			else t = replace_charctor(qb, db, da, bw, aq);
			if (t <=10)return t;
		}
		return 99;
	}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >>a>> b;
	if (a==b) { cout << 0 << endl; return 0;}
	while (cin >> aq[_1] >> bw[_1])_1++;
	int t=bfs();
	if (t > 10)cout << "NO ANSWER!";
	else cout << t;
	return 0;
}
dfs写法
#include<iostream>
#include<math.h>
#include<vector>         
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<unordered_map>
using namespace std;
string a,b;
int ans=1e9;
int cur;
string s[10], t[10];
void dfs(string u,int cnt)
{
    if(cnt>10||cnt>=ans)return;
    if(u==b){ans=min(ans,cnt);return;}
        for (int i = 0; i < cur - 1; ++ i){
        int p = u.find(s[i]);
        if (p == -1) continue;
        u.replace(p, s[i].size(), t[i]);
        dfs(u, cnt + 1);
        p = u.find(t[i]);
        u.replace(p, t[i].size(), s[i]);
    }
}
int main()
{
    cin>>a>>b;
    string A,B;
    while (cin >> s[cur] >> t[cur ++ ]);
    dfs(a,0);
    if (ans > 10) cout << "NO ANSWER!";
    else cout << ans;
    return 0;
}