BFS,设置一个结构体,将当前已被替换的字符串和步数放入队列,特别要注意当前串可能不只有一个子串,所以要用while循环扫完所有,注意while语句里的break一定要加上。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<map>
using namespace std;
int n;
string src, des;
pair<string, string>mp[7];
struct p {
string s;
int c;
p(string ss,int cnt) {
s = ss;
c = cnt;
}
};
void bfs() {
queue<p>q;
q.push(p(src, 0));
while (!q.empty()) {
p f = q.front();
q.pop();
for (int i = 0; i < n;i++) {
string str = f.s;
int pos = str.find(mp[i].first);
while ( pos!= -1) {
string s1 = str;
s1.replace(s1.begin() + pos, s1.begin() + pos + mp[i].first.length(), mp[i].second);
if (f.c + 1 > 10) {
cout << "NO ANSWER!";
return;
}
if (s1 == des) {
cout << f.c + 1;
return;
}
q.push(p(s1, f.c + 1));
if (pos + 1 < str.length())
pos = str.find(mp[i].first, pos + 1);
else
break; //这个必须要有,不然会死循环呜呜呜 调了一个小时
}
}
}
cout << "NO ANSWER!";
}
int main() {
cin >> src >> des;
string s1, s2;
n = 0;
while (cin >> s1 && cin >> s2) {
mp[n++] = make_pair(s1, s2);
}
bfs();
return 0;
}