题目描述
已知有两个字串 A,BA,BA,B 及一组字串变换的规则(至多 666 个规则):
A1A_1A1 -> B1 B_1B1
A2A_2A2 -> B2B_2B2
规则的含义为:在 AAA 中的子串 A1A_1A1 可以变换为 B1 B_1B1 , A2A_2A2 可以变换为 B2B_2B2 …。
例如: AAA =' abcdabcdabcd ' BBB =' xyzxyzxyz '
变换规则为:
‘ abcabcabc ’->‘ xuxuxu ’‘ ududud ’->‘ yyy ’‘ yyy ’->‘ yzyzyz ’
则此时, AAA 可以经过一系列的变换变为 BBB ,其变换的过程为:
‘ abcdabcdabcd ’->‘ xudxudxud ’->‘ xyxyxy ’->‘ xyzxyzxyz ’
共进行了 333 次变换,使得 AAA 变换为 BBB 。
输入输出格式
输入格式:
输入格式如下:
AAA BBB
A1A_1A1B1B_1B1
A2A_2A2B2B_2B2 |-> 变换规则
... ... /
所有字符串长度的上限为 202020 。
输出格式:
输出至屏幕。格式如下:
若在 101010 步(包含 101010 步)以内能将 AAA 变换为 BBB ,则输出最少的变换步数;否则输出"NO ANSWER!"
输入输出样例
输入样例#1: 复制
abcd xyz abc xu ud y y yz
卡了我三四天的题,今天终于A了,这题的数据还真是NICE
思路:BFS来搜索可以替换的字符,不过要注意的是有的可以替换的字符不需要替换(例如aabcc,答案是abbcc 我们只需要替换第二个a)注意此情况即可,还要记得标记
附上find函数应用链接:https://blog.youkuaiyun.com/laobai1015/article/details/62426137/
replace函数应用链接:https://blog.youkuaiyun.com/jiary5201314/article/details/52502516
#include<bits/stdc++.h>
#define MAXN 100000
using namespace std;
typedef long long ll;
struct Why
{
string a,b;
}A[7]; //记录替换规则
struct ch //结构体队列
{
string str;
ll num;
ch(string temp,int k)
{
str=temp;
num=k;
}
};
string x,y;
ll n;
map<string,int>B; //用来判重
void bfs(string x,string y)
{
queue<ch>T;
T.push(ch(x,0));
B[x]=1;
while(!T.empty())
{
ch t=T.front();
if(t.str==y) //如果找到,BFS一定是最小步数,直接输出即可
{
cout<<t.num<<endl;
return ;
}
else if(t.num>10) //同理
{
cout<<"NO ANSWER!"<<endl;
return ;
}
for(int i=0;i<n;i++) //遍历每一个规则
{
int flag=1,ak=0;
while(flag) //用来解决只替换需要的字符
{
int we=t.str.find(A[i].a,ak); //寻找位置
ak=we+1;
if(we!=-1)
{
string line=t.str;
line=line.replace(line.begin()+we,line.begin()+we+A[i].a.size(),A[i].b); //替换
if(B[line]==0)
{
B[line]=1; //判重
T.push(ch(line,t.num+1));
}
}
else
flag=0;
}
}
T.pop();
}
cout<<"NO ANSWER!"<<endl;
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin>>x>>y;
while(cin>>A[n].a>>A[n].b,!cin.eof())
n++;
bfs(x,y);
return 0;
}