You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#include<bits/stdc++.h>
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
const int N = 10;
|
|
|
|
|
|
|
|
|
|
string ar[N]; //由啥
|
|
|
|
|
string br[N]; //变成啥
|
|
|
|
|
|
|
|
|
|
int n; //规则个数
|
|
|
|
|
string a, B; //原串,目标串
|
|
|
|
|
|
|
|
|
|
//结构体
|
|
|
|
|
struct node {
|
|
|
|
|
string str;
|
|
|
|
|
int step;
|
|
|
|
|
};
|
|
|
|
|
//队列
|
|
|
|
|
queue<node> q;
|
|
|
|
|
|
|
|
|
|
//桶,利用set去重,检查
|
|
|
|
|
set<string> st;
|
|
|
|
|
|
|
|
|
|
//广度优先搜索
|
|
|
|
|
void bfs() {
|
|
|
|
|
//标识原串已经使用过
|
|
|
|
|
st.insert(a);
|
|
|
|
|
|
|
|
|
|
//入队列
|
|
|
|
|
q.push({a, 0});
|
|
|
|
|
|
|
|
|
|
//广度优先
|
|
|
|
|
while (!q.empty()) {
|
|
|
|
|
auto p = q.front();
|
|
|
|
|
q.pop();
|
|
|
|
|
//如果找到
|
|
|
|
|
if (p.str == b) {
|
|
|
|
|
printf("%d\n", p.step);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//大于10步还没有找到
|
|
|
|
|
if (p.step > 10) {
|
|
|
|
|
printf("NO ANSWER!\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//尝试每一种变换方式
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
//变换位置
|
|
|
|
|
for (int j = 0; j < p.str.size(); j++) {
|
|
|
|
|
//发现子串ar[i]
|
|
|
|
|
if (p.str.compare(j, ar[i].size(), ar[i]) == 0) {
|
|
|
|
|
//拷贝出来新的,因为p.str后面还在循环,不能破坏
|
|
|
|
|
string s = p.str;
|
|
|
|
|
//替换,replace:从哪个下标位置开始,一共多长,替换成啥
|
|
|
|
|
s.replace(j, ar[i].size(), br[i]);
|
|
|
|
|
//没有出现过
|
|
|
|
|
if (!st.count(s)) {
|
|
|
|
|
st.insert(s);
|
|
|
|
|
q.push({s, p.step + 1});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//这句话很重要噢~
|
|
|
|
|
printf("NO ANSWER!\n");//十步以内也无法变成b
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
//读入原串,目标串
|
|
|
|
|
cin >> a >> b;
|
|
|
|
|
//读入规则,按 ctrl+d结束
|
|
|
|
|
while (cin >> ar[n] >> br[n]) n++;
|
|
|
|
|
//广度优先搜索
|
|
|
|
|
bfs();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|