原题地址
https://www.luogu.org/problem/show?pid=1032
NOIP2002
字符串 广搜
令蒟蒻们深恶痛绝的字符串处理题……其实算法很简单,单纯的广搜+剪枝,大佬们用的双向广搜,但鉴于数据太水
一遍广搜也可过。
解题思路
剪枝时判断当前搜到的状态是否被搜过,如果已经被搜过就跳过。建议用map进行判断。
参考代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
string s1,s2;
string s[25][25],sx[25],sy[25];
int ka;
map<string,bool> mp;
struct mc
{
strings;
intste;
};
void make(int n,string s1)
{
intk=s1.length();
for(int i=0;i<=k-n;i++)
s[n][i]=s1.substr(i,n);
}
queue<mc> q;
int main()
{
// freopen("string.in","r",stdin);
// freopen("string.out","w",stdout);
cin>>s1>>s2;
intka=s1.length();
intcnt=1;
while(cin>>sx[cnt]>>sy[cnt])cnt++;
q.push((mc){s1,0});
mp[s1]=true;
while(!q.empty())
{
stringx=q.front().s;
intstep=q.front().ste;
q.pop();
intkx=x.length();
if(step>=10) continue;
for(int i=1;i<=cnt;i++)
{
stringy=sx[i];
intky=y.length();
if(ky<=kx) make(ky,x);
for(int j=0;j<=kx-ky;j++)
{
if(s[ky][j]==y)
{
stringss=x.substr(0,j)+sy[i]+x.substr(ky+j,kx-ky-j);
if(mp.count(ss)) continue;
q.push((mc){ss,step+1});
mp[ss]=true;
if(ss==s2)
{
cout<<step+1;
return0;
}
}
}
}
}
cout<<"NOANSWER!"<<endl;
return0;
}