洛谷 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 。

输入输出格式

输入格式:

扫描二维码关注公众号,回复: 2470851 查看本文章

输入格式如下:

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 <bits/stdc++.h>
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)
{
    queue<zly>q;
    map<string,int>seen;
    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 <<endl;
            return 0;
        }
        for(int i = 1;i <= n; i ++)
        {
            ll pos = k.ori.find(be[i],0);
            while(pos != string::npos)
            {
                s = k.ori;
                s.replace(pos,be1[i],en[i]);
                if(seen[s] == 0)
                {
                    q.push(zly(s,k.step+1));
                    seen[s] = 1;
                }
                s = k.ori;
                pos = k.ori.find(be[i],pos+1);
            }
        }
        flag = 1;
    }
    if(flag)cout << "NO ANSWER!" << endl;
}
int main()
{
    cin >> 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;
}

猜你喜欢

转载自blog.csdn.net/zzzanj/article/details/81156933