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.)