Files
python/TangDou/LuoGuBook/P1032.cpp
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

76 lines
1.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}