Cesta kostky
Zadání jsem zmínil včera, tady je moje řešení (nic optimalizováného, protože čas talčil, takže dost velká prasárna):
program projekt;
uses crt;
const rozmer = 8; { rozmer sachovnice }
var pocet: integer;
function strana(aktualni,pohyb:integer):integer; begin
if aktualni = 0 then strana:=pohyb else begin
if (((aktualni=3) OR (aktualni=4)) AND ((pohyb=1) OR (pohyb=2))) OR
(((aktualni=1) OR (aktualni=2)) AND ((pohyb=3) OR (pohyb=4))) then strana:=aktualni;
if (((aktualni=3) OR (aktualni=4)) AND ((pohyb=3) OR (pohyb=4))) OR
(((aktualni=1) OR (aktualni=2)) AND ((pohyb=1) OR (pohyb=2))) then strana:=0;
end;
end;
function retezec(x,y:integer):string;
var pomocna,pomocna2: string;
begin
str(x,pomocna);
str(y,pomocna2);
retezec:=pomocna+pomocna2;
end;
function volno(x,y:integer;cesta:string):boolean;
var i:integer;
pomocna,pomocna2,pomocna3:string;
begin
i:=1;
volno:=true;
str(x,pomocna2);
str(y,pomocna3);
pomocna2:=pomocna2+pomocna3;
for i:=1 to (length(cesta) div 3) do begin
pomocna:=cesta[(i-1)*3+2]+cesta[(i-1)*3+3];
if pomocna = pomocna2 then volno:=false;
end;
end;
procedure tah(x,y,hloubka:integer;cesta:string;kostka:integer);
var pomocna: string;
begin
if hloubka = sqr(rozmer) then begin
writeln(cesta);
inc(pocet);
end else begin
pomocna:=cesta+’,'+retezec(x+1,y);
if (NOT (x=rozmer)) AND volno(x+1,y,cesta) AND (NOT (kostka=1)) then begin
tah(x+1,y,hloubka+1,pomocna,strana(kostka,1));
end;
pomocna:=cesta+’,'+retezec(x-1,y);
if (NOT (x=1)) AND volno(x-1,y,cesta) AND (NOT (kostka=2)) then begin
tah(x-1,y,hloubka+1,pomocna,strana(kostka,2));
end;
pomocna:=cesta+’,'+retezec(x,y+1);
if (NOT (y=rozmer)) AND volno(x,y+1,cesta) AND (NOT (kostka=3)) then begin
tah(x,y+1,hloubka+1,pomocna,strana(kostka,3));
end;
pomocna:=cesta+’,'+retezec(x,y-1);
if (NOT (y=1)) AND volno(x,y-1,cesta) AND (NOT (kostka=4)) then begin
tah(x,y-1,hloubka+1,pomocna,strana(kostka,4));
end;
end;
end;
begin
clrscr;
pocet:=0;
tah(1,1,1,’ 11′,0);
writeln;
writeln(’Pocet reseni: ‘,pocet);
readkey;
end.
spustitelné je to jenom ve Free Pascalu, v Tubro nebo Borland Pascalu přeteče zásobník…

