洛谷 P1032 字串变换(bfs+stl)

题目描述

已知有两个字串 A,BA,B 及一组字串变换的规则(至多 66 个规则):

A_1A1​ -> B_1B1​

A_2A2​ -> B_2B2​

规则的含义为:在 AA 中的子串 A_1A1​ 可以变换为 B_1B1​ , A_2A2​ 可以变换为 B_2B2​ …。

例如: AA =' abcdabcd ' BB =' xyzxyz '

变换规则为:

‘ abcabc ’->‘ xuxu ’‘ udud ’->‘ yy ’‘ yy ’->‘ yzyz ’

则此时, AA 可以经过一系列的变换变为 BB ,其变换的过程为:

‘ abcdabcd ’->‘ xudxud ’->‘ xyxy ’->‘ xyzxyz ’

共进行了 33 次变换,使得 AA 变换为 BB 。

输入输出格式

输入格式:

 

输入格式如下:

AA BB
A_1A1​ B_1B1​
A_2A2​ B_2B2​ |-> 变换规则

... ... /

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

 

输出格式:

 

输出至屏幕。格式如下:

若在 1010 步(包含 1010 步)以内能将 AA 变换为 BB ,则输出最少的变换步数;否则输出"NO ANSWER!"

 

输入输出样例

输入样例#1: 复制

abcd xyz
abc xu
ud y
y yz

这个题  大佬们都是用了stl的转换函数,蒟蒻就借用了一下;

这个题是标准的bfs;只不过加上结构体和map的判重;

大致思路就是讲所有位置上的字符串能替换的都找出来再找下一个;

附上蒟蒻代码

#include 
typedef long long ll;
using namespace std;
string be[20],en[20],a,b,s;
ll be1[20],en1[20],n = 1;
struct zly
{
    string ori;
    ll step;
    zly(string x,ll y):ori(x),step(y){}
};
int bfs(string aa,string bb)
{
    queueq;
    mapseen;
    q.push(zly(aa,0));
    seen[aa] = 1;
    ll flag = 0;
    while(!q.empty())
    {
        zly k = q.front();
        q.pop();
        if(k.step > 10)
        {
            cout << "NO ANSWER!" << endl;
        }
        if(k.ori == bb && k.step <= 10)
        {
            cout << k.step <> a >> b;
    while(cin >> be[n] >> en[n])
    {
        be1[n] = be[n].size();
        en1[n] = en[n].size();
        n++;
        if(n == 7)break;
    }
    n--;
    bfs(a,b);
    return 0;
}

 

你可能感兴趣的:(广搜和深搜,洛谷,队列)