洛谷刷题C++语言 | P1032 字串变换

学习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
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值