[NOIP2002 提高组] 字串变换
2024年12月25日小于 1 分钟
#include <bits/stdc++.h>
using namespace std;
string a, b;
int n; // 规则数量
string A[10], B[10];
map<string, bool> vis;
map<string, int> ans;
queue<string> q;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> a >> b;
n = 1;
while (cin >> A[n] >> B[n])
n++;
n--;
// bfs
q.push(a);
vis[a] = true;
ans[a] = 0;
ans[b] = -1;
while (!q.empty() && ans[b] == -1)
{
string now = q.front();
q.pop();
if (ans[now] == 10)
continue;
// 第 i 个规则
for (int i = 1; i <= n; i++)
{
// 第 j 个位置是否匹配规则
for (int j = 0; j + A[i].size() - 1 < now.size(); j++)
{
bool flag = true;
for (int k = j; k <= j + A[i].size() - 1; k++)
if (now[k] != A[i][k - j])
{
flag = false;
break;
}
if (!flag)
continue;
string temp = "";
for (int k = 0; k < j; k++)
temp += now[k];
temp += B[i];
for (int k = j + A[i].size(); k < now.size(); k++)
temp += now[k];
if (vis[temp] == false)
{
ans[temp] = ans[now] + 1;
vis[temp] = true;
q.push(temp);
}
}
}
}
if (ans[b] == -1)
cout << "NO ANSWER!";
else
cout << ans[b];
return 0;
}