program akce; const { pohyb směry sever (0), východ (1), jih (2) a západ (4) } dx : array [0..3] of longint = (0, 1, 0, -1); dy : array [0..3] of longint = (-1, 0, 1, 0); { omezení vstupu } MaxS = 500; MaxV = 500; MaxL = 500; var Seq : array [1..MaxL] of char; { sekvence příkazů } L : longint; { počet příkazů } Mapa : array [1..MaxS, 1..MaxV] of boolean; { mapa } S, V : longint; { rozměry plánu } Uteku : longint; { počet políček, z nichž robot unikne } Kroku : array [1..MaxS, 1..MaxV, 0..3] of longint; { 0 => neznámo, -1 => vede do smyčky nebo zkoumáno aktuální procházkou } { >0 => počet tahů k úniku } { zásobník stavů pro procházku } ZasX, ZasY : array [1..MaxS * MaxV * 4] of longint; ZasSmer : array [1..MaxS * MaxV * 4] of longint; ZasVel : longint; { aktuální velikost zásobníku } { simuluj jeden příkaz ze zadaného stavu } procedure Prikaz(var X, Y, P, Smer : longint); var NX, NY : longint; begin NX := X; NY := Y; case Seq[P] of 'L' : Smer := (Smer + 3) mod 4; 'R' : Smer := (Smer + 1) mod 4; '+' : begin NX := NX + dx[Smer]; NY := NY + dy[Smer]; end; '-' : begin NX := NX - dx[Smer]; NY := NY - dy[Smer]; end; end; if (NX < 1) or (NY < 1) or (NX > S) or (NY > V) or Mapa[NX, NY] then begin X := NX; Y := NY; end; P := (P mod L) + 1; end; procedure KolikKroku(X0, Y0 : longint); var i, X, Y, P, Smer, k: longint; begin ZasVel := 0; k := 0; { příkazů do cíle } P := 1; { pozice v programu } X := X0; Y := Y0; Smer := 0; { X0, Y0, sever } { dokud nedojdeme do cíle a prozkoumáváme nové stavy } while (k = 0) and (Kroku[X, Y, Smer] = 0) do begin Kroku [X, Y, Smer] := -1; { navštívený stav } inc(ZasVel); { uložit na zásobník } ZasX[ZasVel] := X; ZasY[ZasVel] := Y; ZasSmer[ZasVel] := Smer; { provést nanejvýš L kroků } for i := 1 to L do begin Prikaz(X, Y, P, Smer); if (X < 1) or (Y < 1) or (X > S) or (Y > V) then begin k := i; break; end; { po k krocích v cíli } end; end; { došli jsme po L krocích na známou hodnotu? } if (k = 0) and (Kroku [X, Y, Smer] > 0) then k := Kroku [X, Y, Smer] + L; { pokud jsme došli do smyčky, můžeme nechat Kroku[X, Y, Smer] = -1 } { pro všechny vybrané stavy procházky } if k = 0 then exit; { pokud dojdeme na známou hodnotu nebo do cíle, vybereme zásobník } while ZasVel > 0 do begin Kroku [ZasX[ZasVel], ZasY[ZasVel], ZasSmer[ZasVel]] := k; k := k + L; dec(ZasVel); end; end; var i, j : longint; z : char; f : text; begin { načtení vstupu } assign(f, 'akce.in'); reset(f); readln(f, L); for i := 1 to L do begin read(f, z); Seq[i] := z; end; readln(f, S, V); for j := 1 to V do begin for i := 1 to S do begin read(f, z); Mapa[i, j] := (z = '.'); end; readln(f); end; close(f); { prozkoumáme všechna políčka } Uteku := 0; for i := 1 to S do for j := 1 to V do begin if Mapa[i, j] and (Kroku[i, j, 0] = 0) then KolikKroku(i, j); if Kroku[i, j, 0] > 0 then inc(Uteku); end; { výstup } assign(f, 'akce.out'); rewrite(f); writeln(f, Uteku); for j := 1 to V do begin for i := 1 to S do begin if i > 1 then write(f, ' '); if Kroku[i, j, 0] > 0 then write(f, Kroku[i, j, 0]) else write(f, 0); end; writeln(f); end; close(f); end.