题目描述
已知有两个字串 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;
}