欢迎大家访问我的老师的OJ———caioj.cn
题面描述
思路
这道题其实就是双向广搜。
不过具体实现过程略显繁琐,请细心阅读。
首先,
我们需要找到
A
A
A中与
A
i
A_i
Ai匹配的部分,
bool jg(char *str,int num,int flag)
{
char *now=(flag?a[num]:b[num]);
int len=strlen(now);
for(int i=0;i<len;i++)
if(now[i]!=str[i])return 0;
return 1;
}
之后将匹配部分换成 B i B_i Bi.
for(int i=0;i<len;i++)
{
for(int j=1;j<n;j++)
if(jg(q1[l1].s+i,j,1))
{
r1++;
int k=0,l=0;
while(k<i)
{
q1[r1].s[k]=q1[l1].s[k];
k++;
}
while(l<strlen(b[j]))q1[r1].s[k++]=b[j][l++];//将Ai部分替换为Bi
l=i+strlen(a[j]);//续上
while(l<len)q1[r1].s[k++]=q1[l1].s[l++];
q1[r1].s[k]=0;
q1[r1].ans=q1[l1].ans+1;
}
}
同理,
B串也是如此。
最后答案也就是两边同时进行的步骤和。
AC code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N=10006;
struct node
{
char s[36];int ans;
}q1[N],q2[N];char a[7][26],b[7][36];
int n;
bool pd(char *s1,char *s2)
{
if(strlen(s1)!=strlen(s2))return 0;
int len=strlen(s1);
for(int i=0;i<len;i++)
if(s1[i]!=s2[i])return 0;
return 1;
}
bool jg(char *str,int num,int flag)
{
char *now=(flag?a[num]:b[num]);
int len=strlen(now);
for(int i=0;i<len;i++)
if(now[i]!=str[i])return 0;
return 1;
}
void bfs()
{
int l1,r2,l2,r1;l1=r1=l2=r2=1;
while(l1<=r1&&l2<=r2)
{
if(q1[l1].ans+q2[l2].ans>10)
{
puts("NO ANSWER!");
return;
}
int len=strlen(q1[l1].s);
for(int i=0;i<len;i++)
{
for(int j=1;j<n;j++)
if(jg(q1[l1].s+i,j,1))
{
r1++;
int k=0,l=0;
while(k<i)
{
q1[r1].s[k]=q1[l1].s[k];
k++;
}
while(l<strlen(b[j]))q1[r1].s[k++]=b[j][l++];
l=i+strlen(a[j]);
while(l<len)q1[r1].s[k++]=q1[l1].s[l++];
q1[r1].s[k]=0;
q1[r1].ans=q1[l1].ans+1;
for(int w=1;w<=r2;w++)
if(pd(q1[r1].s,q2[w].s))
{
printf("%d\n",q1[r1].ans+q2[w].ans);
return ;
}
}
}
len=strlen(q2[l2].s);
for(int i=0;i<len;i++)
{
for(int j=1;j<n;j++)
if(jg(q2[l2].s+i,j,0))
{
r2++;
int k=0,l=0;
while(k<i)
{
q2[r2].s[k]=q2[l2].s[k];
k++;
}
while(l<strlen(a[j]))q2[r2].s[k++]=a[j][l++];
l=i+strlen(b[j]);
while(l<len)q2[r2].s[k++]=q2[l2].s[l++];
q2[r2].s[k]=0;
q2[r2].ans=q2[l2].ans+1;
for(int w=1;w<=r1;w++)
if(pd(q2[r2].s,q1[w].s))
{
printf("%d\n",q2[r2].ans+q1[w].ans);
return ;
}
}
}
++l1;++l2;
}
puts("NO ANSWER!");
}
int main()
{
scanf("%s%s",q1[1].s,q2[1].s);
n=1;
while(cin>>a[n]>>b[n])n++;
q1[1].ans=q2[1].ans=0;
bfs();
return 0;
}