六、双向BFS

该博客主要介绍了如何使用双向广度优先搜索(BFS)解决字符串之间的变换问题。通过对给定的字符串集合进行操作,寻找从字符串A到字符串B的最短变换路径。在搜索过程中,控制同一层的处理是关键,确保了搜索效率。文章通过C++代码展示了具体的实现过程,并在AcWing题库中进行了验证。
摘要由CSDN通过智能技术生成

实际上通过开始结尾已知的情况下,我可以对一个树采用同时正向负向搜索,很重要的一个

概念是每次控制同一层

190. 字串变换 - AcWing题库

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define PII pair<int, int>
#define PLL pair<ll, ll>

const int N = 1e6 + 10;
const int M = 2 * N;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps = 1e-8;

string a[N],b[N];
string A,B;
int n;
unordered_map<string,int>da,db;
queue<string>qa,qb;
int exent(queue<string>&qa,unordered_map<string,int>&da,unordered_map<string,int>&db,string a[],string b[])
{
    int d = da[qa.front()];
    while(qa.size() && da[qa.front()] == d)//至关重要的同一层处理
    {
        auto t = qa.front();
        qa.pop();

        for(int i = 0; i < n; i ++)//遍历所有转化方式       
        {
            for(int j = 0; j < t.size(); j ++)//字符串上限20长度更优
            {
                string sa = a[i];
                string sb = b[i];
                int m = sa.size();
                if(t.substr(j,m) == sa)
                {
                    string res = t.substr(0,j) + sb + t.substr(j + m);
                    if(da.count(res)) continue;
                    if(db.count(res))   return  da[res] + db[res] + 1;
                    da[res] = da[t] + 1;
                    qa.push(res);
                }
            }
        }
    }
    return -1;
   
}
int double_bfs()
{
    int temp = 0;
    if(A == B) return 0;
    qa.push(A),da[A] = 0;
    qb.push(B),db[B] = 0;
  
    while(qa.size() && qb.size())
    {   
        int k;
        if(qa.size() <= qb.size())   k = exent(qa,da,db,a,b);
        else   k = exent(qb,db,da,b,a);
        if(k == -1)     ++ temp;
        else    return ++ temp;
        if(temp == 10) return -1;
    } 
    return -1;
}
void solve()
{
    cin >> A >> B;
    while(cin >> a[n] >> b[n]) n ++;
    int t = double_bfs();
    if(t == -1) puts("NO ANSWER!");
    else cout << t << endl;
}
int main()
{
    solve();



    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值