链接:洛谷 P1032
这题要注意的点(keng)挺多的…
题目描述
已知有两个字串A,B及一组字串变换的规则(至多6个规则):
A 1 -> B 1
A 2 -> B 2
规则的含义为:在 A中的子串 A 1可以变换为 B 1,A 2 可以变换为 B 2…。
例如:A=‘abcd’ B=’xyz’
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A可以经过一系列的变换变为B,其变换的过程为:
‘abcd’ -> ‘xud’ -> ‘xy’ -> ‘xyz’
共进行了3次变换,使得A变换为B。
输入格式:
输入格式如下:
A B
A 1 B 1
A 2 B 2 |-> 变换规则
… … /
所有字符串长度的上限为20。
输出格式:
输出至屏幕。格式如下:
若在10步(包含10步)以内能将A变换为B,则输出最少的变换步数;否则输出"NO ANSWER!"
输入样例#1:
abcd xyz
abc xu
ud y
y yz
输出样例#1:
3
分析:
①因为是求最少步数,那么就应当使用BFS而不是DFS,BFS得到的第一个解就是最优解(即最少步数)。
②为方便记录最终步数,创建一个结构体:
struct node
{
string s;
int step;
};
③每一步变换的注意点!
a.某一个字符串其符合的子串不止一个!
b.每一步变换只能变化其中一个子串!(即使有多个相同的符合子串)
c.每一种变换(位置/变换规则不同)都要放进队列中!
也就是说BFS的每一层需包括所有变换位置/变换规则不同的结果字符串。
1)查找所有可替换位置:
s1.find (s2 , pos ):在s1中从下标pos开始查找并返回s2第一次出现的位置下标,若找不到则返回string::npos(若忽略pos则默认从0开始查找)
int t=0;
while((t = s1.s.find(s2,<