字串变换
题目链接
写法一:dfs
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 7;
string a[N],b[N];
int n=0,res=0x3f3f3f3f;
void dfs(string A,string B,int step)
{
if(step>10||(res!=0x3f3f3f3f&&res<=step))return ;
if(A==B)
{
res=min(res,step);
return ;
}
for(int i=0;i<n;i++)
{
if(A.find(a[i])!=string::npos)
{
int pos=A.find(a[i]);
A.replace(pos,a[i].size(),b[i]);
dfs(A,B,step+1);
pos=A.find(b[i]);
A.replace(pos,b[i].size(),a[i]);
}
}
}
int main()
{
string A,B;
cin>>A>>B;
while(cin>>a[n]>>b[n])n++;
dfs(A,B,0);
if(res<=10)cout<<res<<endl;
else cout<<"NO ANSWER!"<<endl;
}
写法二:双端队列广搜
#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;
}