\require{AMSmath}
WisFaq - de digitale vraagbaak voor wiskunde en wiskunde onderwijs


Printen

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

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

Dieric
Student Hoger Onderwijs België - woensdag 20 mei 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.)


woensdag 27 mei 2009

©2001-2024 WisFaq