hi
ja, ich weiß, es gibt bereits tausende sudokulöser im netzt aber ich wills eben selber machen.
hab jetzt auch code fürs lösen durch backtracking (also nix besonderes), aber bei mir gibt er einfach nur schwachsinn aus.
hab den code erst noch so, dass keine bereits eingegebenen zahlen berücksichtgt werden, er soll also einfach nur ein leeres sudoku-feld so füllen, dass keine regel verletzt wird. (werd das dann hinterher natürlich noch ändern)
also der code:
Delphi-Quellcode:
var feld:array[0..8,0..8] of integer;
zahlen:array[1..9]of boolean;
zahlenfest:array[0..8,0..8]of boolean;
Form1: TForm1;
procedure anzeigen;
var i,j:integer;
begin
for i:=0 to 8 do
begin
for j:=0 to 8 do
begin
form1.StringGrid1.Cells[i,j]:=inttostr(feld[j,j]);
end;
end;
application.ProcessMessages;
end;
function reihe_spalte(x,y:integer;zahl:integer):boolean;
var i:integer;
rueck:boolean;
begin
rueck:=true;
for i:=0 to 8 do
begin
if feld[x,i]=zahl then
begin
rueck:=false;
break;
end;
if feld[i,y]=zahl then
begin
rueck:=false;
break;
end;
end;
reihe_spalte:=rueck;
end;
function quadrat(x,y:integer;zahl:integer):boolean;
var i,j,xt,yt,xm,ym:integer;
rueck:boolean;
begin
rueck:=true; //Bestimmung
if x<=2 then xt:=1 //des 9x9 Unterquadrates
else if x>=6 then xt:=3 //...
else xt:=2; //...
if y<=2 then yt:=1 //...
else if y>=6 then yt:=3 //...
else yt:=2; //...
xm:=(xt-1)*3+2;
ym:=(yt-1)*3+2;
for i:=-1 to 1 do
begin
for j:=-1 to 1 do
begin
if feld[xm+i,ym+j]=zahl then rueck:=false;
end;
end;
quadrat:=rueck;
end;
function nextx(x:integer):integer;
var rueck:integer;
begin
if x<8 then rueck:=x+1
else rueck:=0;
nextx:=rueck;
end;
function nexty(x,y:integer):integer;
var rueck:integer;
begin
if x<8 then rueck:=y
else rueck:=y+1;
nexty:=rueck;
end;
procedure zellefuellen(x,y:integer);
var i:integer;
begin
for i:=1 to 9 do
begin
if (reihe_spalte(x,y,i))and(quadrat(x,y,i)) then
begin
feld[x,y]:=i;
anzeigen;
if (x<8)or(y<8) then zellefuellen(nextx(x),nexty(x,y));
end;
end;
feld[x,y]:=0;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
zellefuellen(0,0);
end;
ich hoffe der code is verständlich
also ich seh den fehler nicht, hoffe dass es einer von eucht tut^^
danke schon mal, mr pink
p.s.: bei veränderungsvorschlägen: ich würd gern den rekursiven teil beibehalten (ein grund warum ich das überhaupt mache)