洛谷 P1032 字串变换(BFS,字符串)

链接:洛谷 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,<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值