题解:普通的 BFS 没什么可说的,字符串处理是这道题的难点,同时需要注意哈希判重。
另外,对于 (string) 类来说,学到了一个 push_back((char)) 操作。
c++string类详解
代码如下
#include <bits/stdc++.h>
using namespace std;
int n;
string from[6],to[6],st,ed;
map<string,bool> mp;
struct node{string s;int cnt;};
void read_and_parse(){
cin>>st>>ed;
while(cin>>from[n]>>to[n])n++;
}
string work(const string& s,int idx,int t){
if(idx+from[t].size()>s.size())return "";
for(int i=0;i<from[t].size();i++)if(from[t][i]!=s[i+idx])return "";
string now="";
for(int i=0;i<idx;i++)now.push_back(s[i]);
now+=to[t];
for(int i=idx+from[t].size();i<s.size();i++)now.push_back(s[i]);
return now;
}
void solve(){
queue<node> q;
q.push(node{st,0});
while(q.size()){
node u=q.front();q.pop();
if(mp.find(u.s)!=mp.end())continue;
if(u.cnt>10){puts("NO ANSWER!");return;}
if(u.s==ed){printf("%d
",u.cnt);return;}
mp[u.s]=1;
for(int i=0;i<u.s.size();i++)
for(int j=0;j<n;j++){
string now=work(u.s,i,j);
if(now=="")continue;
q.push(node{now,u.cnt+1});
}
}
puts("NO ANSWER!");
}
int main(){
read_and_parse();
solve();
return 0;
}