AcWing 190. 字串变换(搜索)

题目描述

题目链接

题目大意

  • 从字符串A到字符串B需要至少经过几次替换

解题思路

  • 双向广搜:从两个方向同时搜索,而不是从一个方向搜到另一个方向
  • 每次每一边只扩展一个点是不正确的,正确做法应该是每次每边扩展完整一层

题目代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>

using namespace std;

const int N = 6;

int n;
string A, B;
string a[N], b[N];

int extend(queue<string>& q, unordered_map<string, int>&da, unordered_map<string, int>& db, 
    string a[N], string b[N])
{
    int d = da[q.front()];
    while (q.size() && da[q.front()] == d)
    {
        auto t = q.front();
        q.pop();

        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < t.size(); j ++ )
                if (t.substr(j, a[i].size()) == a[i])
                {
                    string r = t.substr(0, j) + b[i] + t.substr(j + a[i].size());
                    if (db.count(r)) return da[t] + db[r] + 1;
                    if (da.count(r)) continue;
                    da[r] = da[t] + 1;
                    q.push(r);
                }
    }

    return 11;
}

int bfs()
{
    if(A == B) return 0;
    queue<string> qa, qb;
    unordered_map<string, int> da, db;
    
    qa.push(A), qb.push(B);
    da[A] = db[B] = 0;
    
    //int step = 0;
    while(qa.size() && qb.size())
    {
        int t;
        if(qa.size() < qb.size()) t = extend(qa, da, db, a, b);
        else t = extend(qb, db, da, b, a);
        
        if(t <= 10) return t;
       // if( ++ step == 10) return -1; 
    }
    
    return -1;
}

int main()
{
    cin >> A >> B;
    while(cin >> a[n] >> b[n]) n ++;
    
    int t = bfs();
    if(t == -1) puts("NO ANSWER!");
    else cout << t << endl;
    
    return 0;
}
posted @   esico  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示