   Radna Akcija Zbunite Tangentu!
 
   Popunite ovo sto pre svojim (ili nekim fantomskim) podatcima 
   i posaljite  na  adresu  tangenta@unsim.ns.ac.yu. 
   
   Ne menjajte nista, cak ni komentare.
  
  <--- seci ovde ---->
  
  Ime:          
  Prezime:           
  Mesto:              
  Adresa:                      
  Razred:     
  Skola:                       

{--------------------------------------------------------------------------}
{$M 65500,0,300000}
Program Obilazak_Sahovske_Table_Skakacem(Input,Output);
Uses
  Crt;
Const
  MaxDim=50;
  PPX:Array[1..8] Of Integer=(1,2,2,1,-1,-2,-2,-1);
  PPY:Array[1..8] Of Integer=(-2,-1,1,2,2,1,-1,-2);
Type
  Polje=Record
          PoX,PoY,PraznihOkolo:ShortInt;
        End;
  SusPolja=Array[1..8] Of Polje;
  PSusPolja=^SusPolja;
Var
  DimTable,X0,Y0,Resenja:Integer;
  Tabla:Array[1..MaxDim,1..MaxDim] Of Integer;
  T:Text;
  ImeDat:String;
Procedure Inicijalizacija;
Var
  I,J:Integer;
Begin
  Write('            Unesite dimenziju table: ');ReadLn(DimTable);
  Write(' Unesite pocetnu X koordinatu konja: ');ReadLn(X0);
  Write(' Unesite pocetnu Y koordinatu konja: ');ReadLn(Y0);
  Write(' Unesite ime izlazne datoteke (CON za izlaz na ekran): 
');ReadLn(ImeDat);
  For I:=1 To DimTable Do For J:=1 To DimTable Do Tabla[I,J]:=0;
  Resenja:=0;
  Assign(T,ImeDat);
  Rewrite(T);
End;
Procedure StampajTablu;
Var
  I,J:Integer;
Begin
  For I:=1 To DimTable Do
  Begin
    WriteLn(T);
    For J:=1 To DimTable Do Write(T,Tabla[I,J]:6);
  End;
  WriteLn(T);
  Inc(Resenja);
  If KeyPressed Then Begin Close(T);Halt;End;
End;
Function OkoloSlobodnih(X,Y:Integer):Integer;
Var
  I,S:Integer;
Begin
  S:=0;
  For I:=1 To 8 Do
    If 
(X+PPX[I]>=1)And(X+PPX[I]<=DimTable)And(Y+PPY[I]>=1)And(Y+PPY[I]<=DimTable)And(
Tabla[X+PPX[I],Y+PPY[I]]=0) Then Inc(S);
  OkoloSlobodnih:=S;
End;
Procedure Razmeni(Var A,B:Polje);
Var
  C:Polje;
Begin
  C:=A;A:=B;B:=C;
End;
Procedure Pretraga(Nivo,X,Y:Integer);
Var
  I,J:ShortInt;
  Moguce:PSusPolja;
Begin
  New(Moguce);
  Tabla[X,Y]:=Nivo;
  If Nivo=Sqr(DimTable) Then StampajTablu
  Else
  Begin
    For I:=1 To 8 Do
    Begin
      Moguce^[I].PoX:=PPX[I];
      Moguce^[I].PoY:=PPY[I];
      Moguce^[I].PraznihOkolo:=OkoloSlobodnih(X+PPX[I],Y+PPY[I]);
    End;
    For I:=1 To 8 Do
      For J:=1 To 8-I Do
        If Moguce^[J].PraznihOkolo>Moguce^[J+1].PraznihOkolo Then 
Razmeni(Moguce^[J],Moguce^[J+1]);
    For I:=1 To 8 Do
      If (X+Moguce^[I].PoX>=1)And(X+Moguce^[I].PoX<=DimTable)And
         (Y+Moguce^[I].PoY>=1)And(Y+Moguce^[I].PoY<=DimTable)And
         (Tabla[X+Moguce^[I].PoX,Y+Moguce^[I].PoY]=0) Then 
Pretraga(Nivo+1,X+Moguce^[I].PoX,Y+Moguce^[I].PoY);
  End;
  Tabla[X,Y]:=0;
  Dispose(Moguce);
End;
Begin
  Inicijalizacija;
  Pretraga(1,X0,Y0);
End.
{
  Za razliku od klasicnog backtrackinga gde se moguci nastavci ispituju redom,
ovde sa tekuceg polja "skacemo" prvo na ono polje koje je okruzeno sa najmanje
nepretrazenih polja, i tako redom.
}
 
 
{--------------------------------------------------------------------------}
Program Racunanje_Vrednosti_Infiksnog_Izraza(Input,Output);
Const
  Max=100;
Type
  Izr=String[Max];
Var
  I:Integer;
  Z:Izr;
  Greska:Boolean;
Function Izraz:Real;Forward;
Function Term:Real;Forward;
Function Faktor:Real;Forward;
Function Broj:Real;Forward;
Procedure Ucitaj;
Var
  T:Text;
  C:Char;
Begin
  Assign(T,'CON');
  Reset(T);
  Z:='';
  Repeat
    Read(T,C);
    Z:=Z+C;
  Until Z[Ord(Z[0])]='=';
  Close(T);
  While Pos('**',Z)<>0 Do
  Begin
    Insert('^',Z,Pos('**',Z));
    Delete(Z,Pos('**',Z),2);
  End;
End;
Function Pow(X,Y:Real):Real;
Begin
  Pow:=Exp(Y*Ln(X));
End;
Function Broj:Real;
Var
  Ret:Real;
  Poz,Razlom:Real;
Begin
  Ret:=0;
  While (Z[I]>='0') And (Z[I]<='9') Do
  Begin
    Ret:=Ret*10+Ord(Z[I])-Ord('0');
    Inc(I);
  End;
  Razlom:=0;
  If Z[I]='.' Then
  Begin
    Poz:=0.1;
    Inc(I);
    While (Z[I]>='0') And (Z[I]<='9') Do
    Begin
      Razlom:=Razlom+Poz;
      Poz:=Poz/10;
      Inc(I);
    End;
  End;
  Broj:=Ret+Razlom;
End;
Function Stepen:Real;
Var
  Ret:Real;
Begin
  If Z[I]='(' Then
  Begin
    Inc(I);
    Ret:=Izraz;
    If Z[I]<>')' Then Greska:=TRUE;
    Inc(I);
  End
  Else Ret:=Broj;
  Stepen:=Ret;
End;
Function Faktor:Real;
Var
  Ret:Real;
Begin
  Ret:=Stepen;
  While (Z[I]='^') Do
  Begin
    Inc(I);
    Ret:=Pow(Ret,Faktor);
  End;
  Faktor:=Ret;
End;
Function Term:Real;
Var
  Ret:Real;
Begin
  Ret:=Faktor;
  While (Z[I]='*') Or (Z[I]='/') Do
  Begin
    If Z[I]='*' Then Begin Inc(I);Ret:=Ret*Faktor;End
                Else Begin Inc(I);Ret:=Ret / Faktor;End;
  End;
  Term:=Ret;
End;
Function Izraz:Real;
Var
  Ret:Real;
Begin
  Ret:=Term;
  While (Z[I]='+') Or (Z[I]='-') Do
    If (Z[I]='+') Then Begin Inc(I);Ret:=Ret+Term;End
                  Else Begin Inc(I);Ret:=Ret-Term;End;
  Izraz:=Ret;
End;
Var
  Pom:Real;
Begin
  Ucitaj;
  I:=1;
  Greska:=FALSE;
  Pom:=Izraz;
  If I<Ord(Z[0]) Then Greska:=TRUE;
  If Greska Then WriteLn(' Greska!')
            Else WriteLN(Pom:5:9);
End.
{
  Zadatak je uradjen koriscenjem poznate tehnike "rekurzivnog spusta".
}
