点击查看代码
#include<bits/stdc++.h>
using namespace std;
//起始点和终点
string start_str, end_str;
string rule_from[10], rule_to[10]; // 对应的变换规则
int rule_count = 0; // 规则数量
// BFS 核心函数
int bfs() {
//初始化与启动
map<string,int> dist;
queue<string> q;
q.push(start_str);
dist[start_str] = 0;
//开始循环
while (!q.empty()) {
//取出队头
string u = q.front();
q.pop();
// 检查是否已经到达目标
if (u == end_str) {
return dist[u];
}
//剪枝
if (dist[u] >= 10) {
continue;
}
//遍历邻居,尝试每一个规则
for (int i = 0; i < rule_count; i++) {
string from = rule_from[i];
string to = rule_to[i];
int pos = u.find(from, 0); // 从下标0开始找
//因为一个字符串一次变换可能有多种结果,因此要循环入队,每次pos+1
while (pos != string::npos) { // 只要还能找到
// 拼接新字符串:原串前缀 + 变换后的部分 + 原串后缀
string v = u.substr(0, pos) + to + u.substr(pos + from.length());
//判断与入队,没遇到过即可
if (dist.find(v) == dist.end()) {
dist[v] = dist[u] + 1;
q.push(v);
}
//继续寻找下一个可能位置,从pos+1
pos = u.find(from, pos + 1);
}
}
}
// 队列空了也没找到
return -1;
}
int main() {
// 读入起点和终点
cin >> start_str >> end_str;
// 读入规则,因为不知道有多少组,所以用到 cin >> ...
while (cin >> rule_from[rule_count] >> rule_to[rule_count]) {
rule_count++;
}
int steps = bfs();
if (steps == -1) {
cout << "NO ANSWER!" << endl;
} else {
cout << steps << endl;
}
return 0;
}