这一题是广搜不难写,难的就是继续找下去。
所以这里参考了dalao的思路,枚举要变得字符串的每一位,并且继续枚举每一位的每一种变换方法…然后就是看细节了(蒟蒻的细节太弱了…)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pii;
const int N = 2*1e5+5;
const int M = 998244353;
#define INF INT_MAX
#define INM INT_MIN
#define sd(a) scanf("%d",&a)
#define sld(a) scanf("%lld",&a)
#define sdd(a,b) scanf("%d %d",&a,&b)
#define pr(a) printf("%d\n",a)
#define plr(a) printf("%lld\n",a)
#define pr_(a) printf("%d ",a)
#define _pr(a) printf(" %d",a)
map<string,int> mp;
string s1,s2,rule[10],change[10];//rule和change存转换规则
int num = 0,ans;
string check(string s,int i,int j)
{
int flag = 1,k;
string sti = "";
// cout << s << "的第" << i << "位的第" << j <<endl;
if(s.size()-i < rule[j].size()) return "";//后面剩下的单词长度都不够,肯定不行
for(k=0;k<rule[j].size();++k)
{
if(s[i+k] != rule[j][k])
{
flag = 0;
break;
}
}
if(!flag) return "";
sti += s.substr(0,i);
sti += change[j];
sti += s.substr(i+k);
return sti;
}
struct Node
{
string str;
int step;
};
int bfs(string x)
{
Node p,q;
queue<Node> Q;
p.str = x;
p.step = 0;
mp[p.str]++;
Q.push(p);
while(!Q.empty())
{
q = Q.front();
Q.pop();
if(q.str == s2)
{
ans = q.step;
if(ans <= 10) return 1;
else return 0;
}
for(int i=0;i<q.str.size();++i)
{
for(int j=0;j<num;++j)//对于每个位置枚举所有可能的转换情况
{
string sss = check(q.str,i,j);
if(sss != "" && mp[sss] == 0)//可以转换并且没出现过
{
mp[sss]++;
p.str = sss;p.step = q.step+1;
Q.push(p);
}
}
}
}
return 0;
}
int main()
{
cin >> s1 >> s2;
while(cin >> rule[num] >> change[num]) num++;
if(bfs(s1) == 1) pr(ans);
else printf("NO ANSWER!\n");
}