acwing-190. 字串变换(双向bfs)

acwing-190. 字串变换(双向bfs)已知有两个字串 A, B 及一组字串变换的规则(至多 6 个规则):A1→B1A2→B2…规则的含义为:在 A 中的子串 A1 可以变换为 B1、A2 可以变换为 B2…。例如:A=abcd B=xyz变换规则为:abc → xu ud → y y → yz则此时,A 可以经过一系列的变换变为 B,其变换的过程为:abcd → xud → xy → xyz共进行了三次变换,使得 A 变换为 B。输入格式输入格式如下:A BA1 B1A2 B2… …第一行是两个给定的字符串

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

已知有两个字串 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

共进行了三次变换,使得 A 变换为 B。

输入格式
输入格式如下:

A B
A1 B1
A2 B2
… …

第一行是两个给定的字符串 A 和 B。

接下来若干行,每行描述一组字串变换的规则。

所有字符串长度的上限为 20。

输出格式
若在 10 步(包含 10 步)以内能将 A 变换为 B ,则输出最少的变换步数;否则输出 NO ANSWER!。

输入样例:
abcd xyz
abc xu
ud y
y yz
输出样例:
3

题解
双向bfs

#include<bits/stdc++.h>
using namespace std;
const int N = 6;
string a[6],b[6];
int n = 0;
unordered_map<string,int>dist1,dist2;
int extend(queue<string>&q1,queue<string>&q2,string a[],string b[],unordered_map<string,int>&dist1,unordered_map<string,int>&dist2){ 
   
    string t = q1.front();
    q1.pop();
    for(int i = 0;i < t.size();i ++){ 
   
        for(int j = 0;j < n;j ++){ 
   
            int len = a[j].size();
            if(t.substr(i,len) == a[j]){ 
   
                string state = t.substr(0,i) + b[j] + t.substr(i + len);
                if(dist2.count(state))return dist1[t] + 1 + dist2[state];
                if(dist1.count(state))continue;
                dist1[state] = dist1[t] + 1;
                q1.push(state);
            }
        }
    }
    return 11;
}
int bfs(string start,string end){ 
   
    queue<string>q1,q2;
    dist1[start] = 0;
    dist2[end] = 0;
    q1.push(start);
    q2.push(end);
    while(q1.size() && q2.size()){ 
   
        int t;
        if(q1.size() < q2.size()){ 
   
            t = extend(q1,q2,a,b,dist1,dist2);
        }
        else{ 
   
            t = extend(q2,q1,b,a,dist2,dist1);
        }
        if(t <= 10)return t;
    }
    
    return 11;
}

int main(){ 
   
    string start,end;
    cin>>start>>end;
    while(cin>> a[n] >> b[n])n ++;
    
    int ans = bfs(start,end);
    if(ans <= 10)cout<<ans<<endl;
    else cout<<"NO ANSWER!"<<endl;
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168635.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux内核移植步骤「建议收藏」

    linux内核移植步骤「建议收藏」2016.6.8经过一个多星期的内核折磨,今天终于可以写下自己移植内核的一些心得,网上有很多博客论坛都有谈到,但是这些又说的方式有些模糊,这里我综合的几个博客在重新说下内核替换编译的步骤、以及如何更新启动项grub。替换linux的内核一共有两种方式,第一种方式是下载官方kernel提供的源码包,进行编译替换;第二种直接下载内核安装包deb,进行升级替换。下面分别从这两种方式进行一个说明:…

    2022年7月23日
    8
  • 文字识别:CRNN「建议收藏」

    文字识别:CRNN「建议收藏」文字识别:CRNN

    2022年4月20日
    100
  • win10台式机一根网线连接笔记本wifi网络

    win10台式机一根网线连接笔记本wifi网络需求:目前情况:win10笔记本电脑有无线网,win10台式机没法连接无线,现在有一条网线。需要达到的效果:通过网线连接笔记本和台式机,笔记本设置共享网络,那么台式机通过网线获取笔记本共享的网络就可以上网了。一、笔记本电脑需要设置【允许其他网络用户通过此计算机的Internet连接来连接】具体操作步骤如下:1、在设置中搜索控制面板,打开即可2、打开【网络和共享中心】3、点击【更改适配器设置】4、选择【WLAN】右键点击【WLAN】——属性5、.

    2022年6月26日
    129
  • Aggregate聚集的概念

    Aggregate聚集的概念<摘自网络>BW中聚集是指根据InfoCube中几个或者一个维度信息对象创建的小的CUBE,其实是新生成一张事实表,外加一些对应的维度表,可以提供数据的访问效率。Anaggregateisarollupoffactdatawhereatotalvalueissufficientandnodetailedinformationisneede…

    2022年5月20日
    40
  • 开源 Android 游戏引擎(八款)

    开源 Android 游戏引擎(八款)1 AngleAngle 是一款专为 Android 平台设计的 敏捷且适合快速开发的 2D 游戏引擎 基于 OpenGLES 技术开发 该引擎全部用 Java 代码编写 并且可以根据自己的需要替换里面的实现 缺陷在于文档不足 而且下载的代码中仅仅包含有少量的示例教程 最低运行环境要求不详 项目地址 http code google com p angle 2 Rokonrokon 是一

    2026年1月14日
    2
  • 走进小作坊(九)—-省时省力的二八法则

    走进小作坊(九)—-省时省力的二八法则

    2022年1月19日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号