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