Registriert seit: 16. Mär 2004
2.287 Beiträge
|
Re: magisches quadrat, brauch ne idee...
13. Okt 2004, 11:04
also, ich machs doch nicht rekursiv....
das is mein aktueller versuch, funzt wahrscheinlich auch, aber
erstens: muss ich einbauen das jede zahl nur einmal verwendet werden kann (wie???)
zweitens muss ich noch anner performance arbeiten (es gibt 16^16=18446744073709551616 )
Delphi-Quellcode:
procedure TForm1.setfield;
var i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16:integer;
begin
for i1:=1 to 16 do
begin
quadrat[1,1]:=i1;
for i2:=1 to 16 do
begin
quadrat[1,2]:=i2;
for i3:=1 to 16 do
begin
quadrat[1,3]:=i3;
for i4:=1 to 16 do
begin
quadrat[1,4]:=i4;
for i5:=1 to 16 do
begin
quadrat[2,1]:=i5;
for i6:=1 to 16 do
begin
quadrat[2,2]:=i6;
for i7:=1 to 16 do
begin
quadrat[2,3]:=i7;
for i8:=1 to 16 do
begin
quadrat[2,4]:=i8;
for i9:=1 to 16 do
begin
quadrat[3,1]:=i9;
for i10:=1 to 16 do
begin
quadrat[3,2]:=i10;
for i11:=1 to 16 do
begin
quadrat[3,3]:=i11;
for i12:=1 to 16 do
begin
quadrat[3,4]:=i12;
for i13:=1 to 16 do
begin
quadrat[4,1]:=i13;
for i14:=1 to 16 do
begin
quadrat[4,2]:=i14;
for i15:=1 to 16 do
begin
quadrat[4,3]:=i15;
for i16:=1 to 16 do
begin
quadrat[4,4]:=i16;
if isCorrect
then ListBox1.Items.Add(getfieldstring);
end;
end;
end;
end;
end;
ProgressBar6.Position:=trunc(i11/16*100);
Application.ProcessMessages;
end;
end;
ProgressBar5.Position:=trunc(i9/16*100);
end;
end;
ProgressBar4.Position:=trunc(i7/16*100);
end;
end;
ProgressBar3.Position:=trunc(i5/16*100);
end;
end;
ProgressBar2.Position:=trunc(i3/16*100);
end;
end;
ProgressBar1.Position:=trunc(i1/16*100);
end;
end;
so, und dann meine prüffunciton
Delphi-Quellcode:
function TForm1.isCorrect:boolean;
var
i:integer;
correct:boolean;
begin
correct:=true;
i:=0;
while (correct) and (i<4) do
begin
inc(i);
if quadrat[i,1]+quadrat[i,2]+quadrat[i,3]+quadrat[i,4]<>34
then correct:=false;
if quadrat[1,i]+quadrat[2,i]+quadrat[3,i]+quadrat[4,i]<>34
then correct:=false;
end;
if quadrat[1,1]+quadrat[2,2]+quadrat[3,3]+quadrat[4,4]<>34
then correct:=false;
if quadrat[1,4]+quadrat[2,3]+quadrat[3,2]+quadrat[4,1]<>34
then correct:=false;
isCorrect:=correct;
end;
was kann man noch anders/besser machen?
getfieldstring gibt einfach nur die werte, durch semikolons getrennt in einem string zurück:
Delphi-Quellcode:
function TForm1.getfieldstring:string;
begin
result:=inttostr(quadrat[1,1])+'; '+inttostr(quadrat[1,2])+'; '+inttostr(quadrat[1,3])+'; '+inttostr(quadrat[1,4])+
'; '+inttostr(quadrat[2,1])+'; '+inttostr(quadrat[2,2])+'; '+inttostr(quadrat[2,3])+'; '+inttostr(quadrat[2,4])+
'; '+inttostr(quadrat[3,1])+'; '+inttostr(quadrat[3,2])+'; '+inttostr(quadrat[3,3])+'; '+inttostr(quadrat[3,4])+
'; '+inttostr(quadrat[4,1])+'; '+inttostr(quadrat[4,2])+'; '+inttostr(quadrat[4,3])+'; '+inttostr(quadrat[4,4]);
end;
»Unlösbare Probleme sind in der Regel schwierig...«
|