https://www.luogu.org/problemnew/show/P1032
- bfs要注意确认是否进入过终态, 防止while语句在没有进入终态的情况下结束并进行判别.
#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 40
#define bug(x) cout<<#x<<"="<<x<<endl;
using namespace std;
int N=0;//转换模式的数目
string orig[LEN],dest[LEN];
map<string,bool> vis;
string S,E;
//多值替换. 对于原串str, 如果有多个子串匹配model的from串,将所有的替换结果保存在ans中.
bool translate(string& str,int model,vector<string>& ans){
string from=orig[model];
string to=dest[model];
int pos,pre=0;
bool isFind=false;
while( ( pos=str.find(from,pre) )!=string::npos ){
isFind=true;
string tmp=str;
tmp.replace(pos,from.size(),to);
ans.push_back(tmp);
pre=pos+from.size();
}
return isFind;
}
void bfs(){
queue<string> q;
q.push(S);
vis[S]=1;
int step=0;
bool isFind=false;
while(!q.empty()){
int sz=q.size();
while(sz--){
string u=q.front();
q.pop();
if(u==E){
isFind=true;
goto END;
}
FF(i,N){ //对于N种情况进行分析
vector<string> v;
if(translate(u,i,v)){
FF(j,v.size()){
string nd=v[j];
if(!vis[nd]){
vis[nd]=1;
q.push(nd);
}
}
}
}
}
step++;
}
END:
if (step > 10 || step == 0 || !isFind) //特别注意isFind.如果while语句自然死亡,就要确定是否进入了终态
cout << "NO ANSWER!" << endl;
else
cout << step<< endl;
}
int main()
{
freopen("./in2","r",stdin);
cin>>S>>E;
while(cin>>orig[N]>>dest[N])
N++;
bfs();
return 0;
}