Acasa Tehnologie Backtracking: numerele lui Gigel

Backtracking: numerele lui Gigel

by Dragos Schiopu

Backtracking

>

{numerele lui Gigel}
program nr_lui_gigel; {iterativ}
type stiva=array[1..100] of integer;
var st:stiva;
i,n,k:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=-1;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<9 then begin st[k]:=st[k]+1;
                                  as:=true;
                        end
                else as:=false;
end;
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
                         if st[i] mod 2 <> 0 then ev:=false;
for i:=1 to k-1 do
                         if st[i]<st[i+1] then ev:=false;

end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(st[i]);
writeln;
end;
begin
write('n=');readln(n);
k:=1 ;init(k,st);
while k>0 do 
     begin
         repeat
              succesor(as,st,k);
              if as then valid(ev,st,k);
         until (not as) or (as and ev);
     if as then if solutie(k) then tipar
                                       else begin
                                              k:=k+1;
                                              init(k,st);
                                              end
             else k:=k-1;
     end;
   readln;
 end.
{PascalZone.uv.ro}

s-ar putea sa-ti placa