题目链接:wikioi 1099
解题思路:
双向广搜,map判重+记录结果(宽搜也可AC)
代码:
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
string a,b;
string aa[15],bb[15];
int main()
{
cin>>a>>b;
while(cin>>aa[n]>>bb[n])
n++;
queue<pair<string,int> > q1,q2;
map<string,int> pnt[2];
pair<string,int> head=make_pair(a,0),rear=make_pair(b,0);
pnt[0][a]=0,pnt[1][b]=0;
q1.push(head),q2.push(rear);
int len1,len2,len,cnt1,cnt2;
string st1,st2,new_str;
while(!q1.empty()&&!q2.empty())
{
head=q1.front(),rear=q2.front();
q1.pop(),q2.pop();
st1=head.first,st2=rear.first;
cnt1=head.second,cnt2=rear.second;
len1=st1.size(),len2=st2.size();
for(int i=0;i<n;i++)
{
len=aa[i].size();
for(int j=0;j<len1-len+1;j++)
{
if(st1[j]==aa[i][0])
{
int flag=1;
for(int k=1;k<len;k++)
{
if(st1[j+k]!=aa[i][k])
{
flag=0;
break;
}
}
if(flag)
{
new_str=st1.substr(0,j)+bb[i]+st1.substr(j+len,len1-len-j);
if(!pnt[0].count(new_str))
{
if(pnt[1].count(new_str))
{
cout<<cnt1+pnt[1][new_str]+1<<endl;;
exit(0);
}
else
{
q1.push(make_pair(new_str,cnt1+1));
pnt[0][new_str]=cnt1+1;
}
}
}
}
}
}
for(int i=0;i<n;i++)
{
len=bb[i].size();
for(int j=0;j<len2-len+1;j++)
{
if(st2[j]==bb[i][0])
{
int flag=1;
for(int k=1;k<len;k++)
{
if(st2[j+k]!=bb[i][k])
{
flag=0;
break;
}
}
if(flag)
{
new_str=st2.substr(0,j)+aa[i]+st2.substr(j+len,len2-len-j);
if(!pnt[1].count(new_str))
{
if(pnt[0].count(new_str))
{
cout<<cnt2+pnt[0][new_str]+1<<endl;;
exit(0);
}
else
{
q2.push(make_pair(new_str,cnt2+1));
pnt[1][new_str]=cnt2+1;
}
}
}
}
}
}
}
cout<<"NO ANSWER!"<<endl;
return 0;
}