Cod sursa(job #226196)

Utilizator valytgjiu91stancu vlad valytgjiu91 Data 1 decembrie 2008 10:25:09
Problema Dame Scor 20
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.11 kb
Type stiva=array[1..1000] of integer;
Var
   st:stiva;
   as,ev:boolean;
   k,N:integer;
   f,g:text;
{ 1. Ce punem in stiva? }
Procedure init(k:integer; var st:stiva);
begin
     st[k]:=0;
end;
Procedure succesor (k:integer; var st:stiva; var as:boolean);
begin
     if st[k]<N then begin
                           st[k]:=st[k]+1;
                           as:=True;
                      end
                 else as:=False;
end;
Procedure valid(k:integer; st:stiva; var ev:boolean);
var i:integer;
begin
     ev:=True;
     { distincte }
     For i:=1 To k-1 Do
         if (st[k]=st[i]) Or (abs(st[k]-st[i])=k-i) then begin
                        ev:=False;
                        break;
            end;
end;
Function Solutie(k:integer):boolean;
begin
      Solutie:=(k=N);
end;
Procedure Tipar(k:integer);
var i,j:integer;
begin
writeln(g,n);
     For i:=1 to k do
       For j:=k downTo 1 do
          if st[i]=j then Writeln(g,i,' ',j);
end;
Begin
      assign(f,'dame.in');
      reset(f);
     Readln(f,N);
     close(f);
     assign(g,'dame.out');
     rewrite(g);
     if n=1 then begin writeln(g,n);  writeln(g,'1 1');end
       else if n=2 then begin writeln(g,1);  writeln(g,'1 1');end
       else if n=3 then begin writeln(g,2); writeln(g,'1 1');writeln(g,'2 3');end
       else
       begin
     k:=1;
     init(k,st);
     while k>0 do begin { cat timp stiva nu este vida }
          repeat
                { 1. Ce punem in stiva? }
                succesor(k,st,as);
                if as then { Este valida valoarea pusa? }
                           valid(k,st,ev);
          until (as and ev) Or (Not as);
          if as then
                    if Solutie(k) then begin Tipar(k);k:=0; end
                                  else begin
                                            { urcam in stiva }
                                            k:=k+1;
                                            init(k,st);
                                       end
                else { coboram in stiva }
                     k:=k-1;
     end;
     end;
close(g);
End.