题目描述 Description
已知有两个字串 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 。
输入描述 Input Description
输入格式如下:
A
B
A1
A2
B2
|-> 变换规则
… … /
所有字符串长度的上限为 20。
输出描述 Output Description
若在 10 步(包含 10步)以内能将 A
变换为B
,则输出最少的变换步数;否则输出”NO ANSWER!”
样例输入 Sample Input
abcd xyz
abc xu
ud y
y yz
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
hehe
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int main()
{
queue<string> q;
queue<int> num;
string x,y,a[6][2],s,w;
int i=0,position,t=1,k;
cin>>x>>y;
while (cin>>a[i][0]>>a[i][1])
i++;
q.push(x);
num.push(t);
while (!q.empty())
{
s=q.front();
q.pop();
t=num.front();
num.pop();
if (t==10)
{
cout<<"NO ANSWER!";
return 0;
}
for (int j=0;j<i;j++)
{
k=0;
while (s.find(a[j][0],k)!=-1)
{
position=s.find(a[j][0],k);
num.push(t+1);
w=s;
w.replace(position,a[j][0].length(),a[j][1]);
if (w==y)
{
cout<<t;
return 0;
}
q.push(w);
k=position+1;
}
}
}
cout<<"NO ANSWER!";
return 0;
}