P1032 字串变换题解

题目传送门

C++代码

#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;
}
posted @   糖豆爸爸  阅读(50)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
Live2D
点击右上角即可分享
微信分享提示