P1032 字串变换

点击查看代码
#include<bits/stdc++.h>
using namespace std;

//起始点和终点
string start_str, end_str;
string rule_from[10], rule_to[10]; // 对应的变换规则
int rule_count = 0;                // 规则数量

// BFS 核心函数
int bfs() {
    //初始化与启动
    
    map<string,int> dist;
    queue<string> q;
    q.push(start_str);
    dist[start_str] = 0;
        
   

    
    //开始循环
    while (!q.empty()) {
        //取出队头
        string u = q.front();
        q.pop();

        // 检查是否已经到达目标
        if (u == end_str) {
            return dist[u];
        }

        //剪枝
        if (dist[u] >= 10) {
            continue;
        }

        //遍历邻居,尝试每一个规则
        for (int i = 0; i < rule_count; i++) {
            string from = rule_from[i];
            string to = rule_to[i];

            
            int pos = u.find(from, 0); // 从下标0开始找
            //因为一个字符串一次变换可能有多种结果,因此要循环入队,每次pos+1
            while (pos != string::npos) { // 只要还能找到
                // 拼接新字符串:原串前缀 + 变换后的部分 + 原串后缀
                string v = u.substr(0, pos) + to + u.substr(pos + from.length());

                //判断与入队,没遇到过即可
                if (dist.find(v) == dist.end()) {
                    dist[v] = dist[u] + 1;
                    q.push(v);
                }

                //继续寻找下一个可能位置,从pos+1
                pos = u.find(from, pos + 1);
            }
        }
    }

    // 队列空了也没找到
    return -1;
}

int main() {
    // 读入起点和终点
    cin >> start_str >> end_str;

    // 读入规则,因为不知道有多少组,所以用到 cin >> ... 
    while (cin >> rule_from[rule_count] >> rule_to[rule_count]) {
        rule_count++;
    }

    int steps = bfs();

    if (steps == -1) {
        cout << "NO ANSWER!" << endl;
    } else {
        cout << steps << endl;
    }

    return 0;
}
posted @ 2026-01-15 23:57  AnoSky  阅读(4)  评论(0)    收藏  举报