WisFaq!

\require{AMSmath} geprint op dinsdag 8 oktober 2024

Algoritme om de schuifpuzzel op te lossen(in Turbo Pascal)

Een algoritme om de schuifpuzzel op te lossen in Turbo Pascal.

Dierick Wim
20-5-2009

Antwoord

Dat kan met behulp van recursie, als volgt: (0 stelt het lege vakje voor)

program schuifpuzzel;
type vierkant=array[0..2,0..2] of 0..8;
var a:vierkant; klaar:boolean;
procedure schud(var a:vierkant);
var i,j:0..2;
begin
writeln('Geef aan elk van de negen matrixelementen');
writeln('een verschillende waarde uit 0..8');
for i:=0 to 2 do for j:=0 to 2 do readln(a[i,j])
end{schud};
procedure schuif(var a:vierkant);
var i,j:0..2; foutontdekt,zet:boolean; r:real;
procedure schrijf(var a:vierkant);
var i,j:0..2;
begin
writeln;
for i:=0 to 2 do
begin writeln; for j:=0 to 2 do write(a[i,j]:2) end
end{schrijf};
begin
schrijf(a); readln;
foutontdekt:=false;
for i:=0 to 2 do for j:=0 to 2 do
if a[i,j]3*i+j then foutontdekt:=true;
if not foutontdekt then klaar:=true else
for i:=0 to 2 do for j:=0 to 2 do
if a[i,j]=0 then
begin
r:=random; zet:=false;
if r=0.25 then
if i0 then
begin zet:=true; a[i,j]:=a[i-1,j]; a[i-1,j]:=0; schuif(a) end;
if ((r0.25) and (r=0.5)) then
if j0 then
begin zet:=true; a[i,j]:=a[i,j-1]; a[i,j-1]:=0; schuif(a) end;
if ((r0.5) and (r=0.75)) then
if i2 then
begin zet:=true; a[i,j]:=a[i+1,j]; a[i+1,j]:=0; schuif(a) end;
if r0.75 then
if j2 then
begin zet:=true; a[i,j]:=a[i,j+1]; a[i,j+1]:=0; schuif(a) end;
if not zet then schuif(a)
end
end{schuif};
begin
klaar:=false; schud(a); schuif(a)
end.

(Als u nu geduldig op enter blijven drukken, zullen de matrixelementen op een gegeven moment toevallig in de natuurlijke volgorde staan, en dan is de puzzel opgelost.)

hr
27-5-2009


© 2001-2024 WisFaq
WisFaq - de digitale vraagbaak voor het wiskunde onderwijs - http://www.wisfaq.nl

#59360 - Puzzels - Student Hoger Onderwijs België