字串变换
题目链接
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
const int N = 6;
string a[N],b[N];
string A,B;
int idx=0;
int extend(queue<string>&q,unordered_map<string,int>&nowd,unordered_map<string,int>&red,string now[],string re[])
{
string s=q.front();
q.pop();
for(int i=0;i<s.size();i++)
{
for(int j=0;j<idx;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 11;
}
int bfs()
{
unordered_map<string,int> da,db;
queue<string> qa,qb;
qa.push(A);da[A]=0;
qb.push(B);db[B]=0;
int t=0;
while(qa.size()&&qb.size())
{
if(qa.size()<qb.size())t=extend(qa,da,db,a,b);
else t=extend(qb,db,da,b,a);
if(t<=10)return t;
}
return 11;
}
int main()
{
cin>>A>>B;
if(A==B)
{
cout<<0<<endl;
return 0;
}
while(cin>>a[idx]>>b[idx])idx++;
int t=bfs();
if(t>10)cout<<"NO ANSWER!"<<endl;
else cout<<t<<endl;
}