学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:洛谷刷题C++语言 | 汇总_热爱编程的通信人的博客-CSDN博客
【题目描述】
已知有两个字串 A,B 及一组字串变换的规则(至多 6 个规则),形如:
- A1→B1。
- A2→B2。
规则的含义为:在 A 中的子串 A1 可以变换为 B1,A2 可以变换为 B2⋯。
例如:A=abcd,B=xyz,
变换规则为:
- abc→xu,ud→y,y→yz。
则此时,A 可以经过一系列的变换变为 B,其变换的过程为:
- abcd→xud→xy→xyz。
共进行了 3 次变换,使得 A 变换为 B。
【输入】
第一行有两个字符串 A,B。
接下来若干行,每行有两个字符串 Ai,Bi,表示一条变换规则。
【输出】
若在 10 步(包含 10 步)以内能将 A 变换为 B,则输出最少的变换步数;否则输出 NO ANSWER!。
【输入样例】
abcd xyz
abc xu
ud y
y yz
【输出样例】
3
【代码详解】
#include <bits/stdc++.h>
using namespace std;
string a, b, ai[10], bi[10];
int t, mark;
struct node {
string s;
int step;
};
int main()
{
cin >> a >> b;
while (cin >> ai[t] >> bi[t]) t++;
queue<node> q;
node tp = {a, 0};
q.push(tp);
while (!q.empty()) {
node tp = q.front();
q.pop();
if (tp.step==10) continue;
for (int i=0; i<t; i++) {
mark = tp.s.find(ai[i]);
while (mark != -1) {
string ts = tp.s; //使用临时字符串,因为后面需要修改并压入队列
ts.replace(mark, ai[i].size(), bi[i]);
if (ts==b) {
cout << tp.step+1 << endl;
return 0;
}
node t = {ts, tp.step+1};
q.push(t);
mark = tp.s.find(ai[i], mark+1); //要注意使用原始字符串继续查找
}
}
}
cout << "NO ANSWER!" << endl;
return 0;
}
【运行结果】
abcd xyz
abc xu
ud y
y yz
^Z
3