[NOIP2002 提高组] 字串变换 题解
前言
双向广搜的代码又臭又长。
讲解
思路
看数据范围,显然普通爆搜(应该)是不能过的,那么我们在这个基础上优化。不难想到,优化可以是把普通广搜改成双向广搜,即从两头搜。
那么,什么是双向广搜?
双向广搜,就是在已知搜的起点和搜的终点是什么,要让你求步数或其他啥的对广搜的优化。双向广搜字面意思,就是从起点和终点两头一起搜,用到两个队列。如果搜到一起了,那么就是通的,也就是最短路径(因为是广搜嘛)。如果一直到两个队列一个空了,那么有一边没路了。
就比如走迷宫,在确定终点和起点在哪里的情况下,两边正常广搜,可以共用一个标记数组,也可以用两个分开的数组。如果撞在一起了,那么这个迷宫是通的,如果你想输出步数,用数组来记录一下也可以。如果两边队列有一个空了,那说明这个迷宫走不通。
这个题也是用双向广搜,从初始字符串和终点字符串两边搜,初始字符串那边因为是顺着搜,所以就按照正常的变换方式;终点字符串那边因为是倒着搜,所以就按照变换方式相反的方式变,也可以说把 →\texttt{→}→ 符号变成 ←\texttt{←}← 符号。
代码
别抄,代码风格难看,且一堆 debug。