zOs/SQL/LABYRIN
with labyrinth (lab) as -- das leere Labyrinth
( select 'X|XXXXXXXXXXXXXXXXX' -- 1
|| 'X| X X X X' -- 2
|| 'X XXX X XXX XXX X' -- 3
|| 'X X X XXX X X' -- 4
|| 'X XXXXXXX XXX X X' -- 5
|| 'X X X X X X' -- 6
|| 'XXX X XXX XX X XX X' -- 7
|| 'X X X X X' -- 8
|| 'X XXXXX X XXXXXX XX' -- 9
|| 'X X *' --10
|| 'XXXXXXXXXXXXXXXXXXX' --11
-- 123456789 123456789
from sysibm.sysDummy1
)
, zeilen (Z) as -- Anzahl Zeilen
( select 1 from sysibm.sysDummy1
union all select z+1 from zeilen where z < 11
)
, schritt (delta, chr) as -- die 4 möglichen Schritte
( select 1, '>' from sysibm.sysDummy1 -- nach rechts
union all select -1, '<' from sysibm.sysDummy1 -- nach links
union all select 19, '|' from sysibm.sysDummy1 -- nach unten
union all select -19, 'i' from sysibm.sysDummy1 -- nach oben
)
, suche (lab, pos, sta, len) as -- Suche einen Weg
( select lab, 21, 'ok', 0 -- Start: das leere Labyrinth
from labyrinth
union all select -- Schritt a: probiere alle Schritte
lab, pos + delta, 'p' || chr, len+1
from suche, schritt
where sta = 'ok' and len < 999
union all select -- Schritt b: markiere Schritt falls ok
left(lab, pos-1) || substr(sta, 2) || substr(lab, pos+1) ,
pos, 'ok', len+1
from suche
where sta like 'p%' and substr(lab, pos, 1) = ' ' and len < 999
union all select -- Ende: Ziel gefunden?
lab, pos, 'zi', len+1
from suche
where sta like 'p%' and substr(lab, pos, 1) = '*' and len < 999
)
-- Zeilen der Labyrinthe anzeigen
select substr(lab, 19 * z - 18, 19) ,len
from suche, zeilen
where sta = 'zi'
order by len, lab, z