|
--x空石头,2左边的青蛙,1右边的青蛙
with t as (
--pos 正数表示X向右移动,负数表示向左移动. c 表示X移动后的位置上是1还是2
--正数移动步数全部为1表示1只能向左移动.(即x向右移动时只能与右边的1进行交换位置,不能与2交换位置)
--移动步骤限制只能跳过一个青蛙,所以最多移动位置为2个位置
select round(2.5-level) pos, to_char(ceil(level/2)) c
from dual
connect by level<=4
),
r (s, x_pos, path) as (
--'222x111' status 初始状态,x_pos 4 表示X的位置为4,path:根据with的内嵌循环一层一层的查找,每次拼的都是x的当前位置
select '222x111' s, 4, ''
from dual
union all
select
--x将要移动到的位置前的字符串:将X替换为C,拼接X拼接之后的字符串
substr(replace(r.s, 'x', t.c), 1, x_pos+t.pos-1)||'x'||substr(replace(r.s, 'x', t.c), x_pos+t.pos+1),
--x当前位置
x_pos+t.pos,
--x的移动路径,即如何从初始状态移动到当前的位置的
path||to_char(x_pos+t.pos)||'#'
from t, r
where 1=1
--X移动到的位置: x_pos+t.pos ,该位置上的数字(1或者2)是C,否则会无限循环
and substr(r.s, x_pos+t.pos, 1)=t.c
--X的位置在7和1之间
and x_pos+t.pos between 1 and 7
)
select *
from r
--最终形态
where s='111x222'; |
|