2522: 【普及+/提高】【P1032】字串变换
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:1
解决:1
题目描述
已知有两个字串 及一组字串变换的规则(至多 个规则),形如:
- 。
- 。
规则的含义为:在 中的子串 可以变换为 , 可以变换为 。
例如:,,
变换规则为:
- ,,。
则此时, 可以经过一系列的变换变为 ,其变换的过程为:
- 。
共进行了 次变换,使得 变换为 。
输入
第一行有两个字符串 。
接下来若干行,每行有两个字符串 ,表示一条变换规则。
输出
若在 步(包含 步)以内能将 变换为 ,则输出最少的变换步数;否则输出
NO ANSWER!。样例输入 复制
abcd xyz
abc xu
ud y
y yz
样例输出 复制
3
提示
对于 数据,保证所有字符串长度的上限为 。
#include<bits/stdc++.h>
using namespace std;
struct point {
string s;
int step;
};
int main(){
string a,b,ai[10],bi[10];
int t = 0;
cin >> a >> b;
while (cin >> ai[t] >> bi[t]) t++;
queue <point> q;
q.push({a,0});
while(!q.empty()) {
point p=q.front();
q.pop();
if (p.step == 10 ) continue;
for (int i = 0; i < t; i++) {
int mark=p.s.find(ai[i]);
while (mark != -1) {
string ts=p.s;
ts.replace(mark,ai[i].size(),bi[i]);
if (ts == b) {
cout << p.step + 1;
return 0;
}
q.push(point{ts,p.step + 1});
mark = p.s.find(ai[i],mark + 1);
}
}
}
cout << "NO ANSWER!";
return 0;
}