Program PerpiestasOrnamentas;
  { 42 u‘davinys, taisyta antroji programa }
Const
  Byla = 'ORNAM.DAT';
  MaxX = 50;
  MaxY = 50;

Type Ornam = Array [1..MaxY] of String [MaxX];
     Atsakymas = (Teis, Klaid, Papild, Pasal);

Var O : Ornam; { perpiežtas ornamentas }

  Procedure Pakeisk (y, x : Integer);
  Begin
    If o[y, x]='1' then o[y, x]:= '0'
                   else o[y, x]:= '1';
  End; { Pakeisk }

  Procedure Tikrink (Nerasta : Boolean; { ar nerasta klaida }
                     Var Rez : Atsakymas; { atsakymo tipas }
                     Var Xrez, Yrez : integer { langelio koordinat‚s });
  { Rekursin‚ proced–ra, kuri tikrina, ar teisingai perpiežtas.
    ornamentas. Radus klaid…, bandoma j… taisyti (proced–ra kreipiasi
    Ť save su parametru Nerasta = False).
    Kai proced–ros parametras
    Nerasta = False, tai joki— pakeitim— ornamente daryti negalima;
    Nerasta = True,  tai galime pakeisti vien… langelŤ.
    Vartojamas globalus kintamasis O }
  Var xmin, xmax, ymin, ymax,  { ribin‚s piežinio koordinat‚s }
      x, y       : Integer;
      Ats        : Atsakymas;  { pagalbiniai kintamieji }
  Begin
    xmin := MaxX + 1;          { randame xmin ir xmax }
    xmax := 0;
    For y := 1 to MaxY do
      For x:= 1 to MaxX do
        If O[y, x] = '1' Then
           Begin
            If x < xmin Then xmin := x;
            If x > xmax Then xmax := x
           End;
    ymin := MaxY + 1;             { randame ymin ir ymax }
    ymax := 0;
    For y := 1 to MaxY do
      If Pos('1', O[y]) > 0 Then
         Begin
           If y < ymin Then ymin := y;
           If y > ymax Then ymax := y
         End;
    { tikrinamas simetrižkumas }
    Ats:= Teis;
    y := ymin;
    Repeat
      x := xmin;
      Repeat
        If (O[y, x] <> O[y, xmax+xmin-x]) or
           (O[y, x] <> O[ymax+ymin-y, x]) Then
           If Nerasta Then
                Begin
                  Pakeisk (y, x); { pataisome piežinŤ }
                  { tikriname, ar pataisytas ornamentas }
                  Tikrink (False, Rez, Xrez, Yrez);
                  If Rez = Teis
                     Then Begin
                            Xrez:= x;
                            Yrez:= y;
                            If o[y, x] = '0'
                               Then Ats:= Pasal { reik‚jo pažalinti }
                               Else Ats:= Papild { reik‚jo papildyti }
                          End
                     Else Ats := Klaid;
                  Pakeisk (y, x); { atstatome piežinŤ }
                End
           Else Ats:= Klaid;
        x := x + 1;
      Until (Ats = Klaid) and not Nerasta or
            { pataisytas piežinys nesimetrižkas }
            (Ats in [Pasal, Papild]) or     { pavyko pataisyti }
            (x > Xmax);             { baig‚si tikrinama eilut‚ }
      y := y + 1
    Until (Ats = Klaid) and not Nerasta or
          (Ats in [Pasal, Papild]) or
          (y > ymax);               { per‘i–r‚tas visas piežinys }
    if Ats = Teis
       Then If ((ymin - ymax) mod 2 <> 0) and ((xmax - xmin) mod 2 <> 0)
               Then Rez := Teis
               Else Rez := Klaid
       Else Rez := Ats;
   end; { Tikrinti }

var Fl    : Text;
    i,
    Xrez,Yrez : Integer;  { vietos, kuri… reikia pataisyti, koordinat‚s }
    Rez: Atsakymas;
Begin
  Assign (Fl, Byla);
  Reset (Fl);
  for i := 1 to MaxY do
    ReadLn (Fl, O[i]);
  Close (Fl);
  Xrez:= 0; Yrez:=0;
  Tikrink (True, Rez, Xrez, Yrez);
  case  Rez of
    Teis   : WriteLn('Perpiežta teisingai.');
    Papild : WriteLn('Reikia papildyti langeliu (',Xrez,', ',Yrez,').');
    Pasal  : WriteLn('Reikia pažalinti langelŤ (',Xrez,', ',Yrez,').');
    Klaid  : WriteLn('Yra daugiau kaip viena klaida.')
  end;
  WriteLn;
  WriteLn ('Paspauskite Enter klaviž… ...');
  ReadLn
End.



