Autor Beitrag
greendesire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 13.03.09 12:56 
Ich programmiere gerade ein Sudoku und will nun zufällig Zahlen in die Felder einfügen.
Mit folgender Prozudur habe ich es hinbekommen, dass sich in den senkrechten Spalten keine Zahlen doppeln.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
with Stringgrid1 do
  Begin
  for i:=0 to 8 do
    Begin
    menges[i]:=[];
   for j:=0 to 8 do
   Begin
    Repeat
      cells[i,j]:=IntToStr(random(9)+1);
      zahl:=StrToInt(cells[i,j]);
    Until not (zahl in menges[i]);
    menges[i]:=menges[i]+[zahl];
   end;
end;
;


Nun habe ich aber das Problem, dass bei den waagerechten Zeilen, dann immer doppelte Zahlen kommen. Ich habe schon versucht, mir einen Algorhytmus dazu auszudenken, aber leider habe ich damit eine Endlosschleife gebaut. Habe schon ganz viel versucht, das umzustellen, aber ich bekomme es leider nicht hin!
Bitte helft mir, wie kann ich überprüfen, dass in den waagerechten Zeilen keine doppelten Zahlen sind?

hier mein Versuch:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
with Stringgrid1 do
  Begin
  for k:=1 to 9 do
  Begin
  mengeW[k]:=[];
  for j:=0 to 8 do
    Begin
   for i:=0 to 8 do
   Begin
   mengeW[k]:=[StrToInt(cells[i,j])];
   Repeat
      cells[i,j]:=IntToStr(random(9)+1);
      kontrolle:=StrToInt(cells[i,j]);
    Until not (zahl in mengew[k]);
    mengeW[k]:=mengeW[k]+[kontrolle];


ich hatte mir gedacht, dass ich in einer weiteren Menge, die schon vorhandenen Zahlen speichere und dann die Zeile durchlaufe und neue Zahlen einfüge, aber jetzt fügt er ja auch Zahlen dort ein, wo eigentlich welche stehen, die schon in der Menge sind. Wie mache ich, dass er diese Felder übergeht?

Es wäre nett, wenn ihr mir helfen könntet, denn ich komme nicht mit meinen Grundkenntnissen weiter.
LG

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Titel geändert.
P-A-L
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Fr 27.03.09 10:31 
Ich hab dein Problem jetzt inhaltlich noch nicht so sehr durchdacht, aber dass das ne Endlosschleife ist, liegt m.E. an den markierten Variablennamen:

user profile icongreendesire hat folgendes geschrieben Zum zitierten Posting springen:

Nun habe ich aber das Problem, dass bei den waagerechten Zeilen, dann immer doppelte Zahlen kommen. Ich habe schon versucht, mir einen Algorhytmus dazu auszudenken, aber leider habe ich damit eine Endlosschleife gebaut. Habe schon ganz viel versucht, das umzustellen, aber ich bekomme es leider nicht hin!
Bitte helft mir, wie kann ich überprüfen, dass in den waagerechten Zeilen keine doppelten Zahlen sind?

hier mein Versuch:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
with Stringgrid1 do
  Begin
  for k:=1 to 9 do
  Begin
  mengeW[k]:=[];
  for j:=0 to 8 do
    Begin
   for i:=0 to 8 do
   Begin
   mengeW[k]:=[StrToInt(cells[i,j])];
   Repeat
      cells[i,j]:=IntToStr(random(9)+1);
      kontrolle:=StrToInt(cells[i,j]);
    Until not (zahl in mengew[k]);
    mengeW[k]:=mengeW[k]+[kontrolle];


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 27.03.09 12:02 
Moin!

Wie wir in diesem Thread bereits herausgefunden haben, geht sowas nur mit Suche in Wikipedia BACKTRACKING. Dabei ist die Grundidee, vorhergehende Entscheidungen wieder rückgängig machen zu können/müssen, wenn man in eine Sackgasse "gelaufen" ist. :idea: Eine typische Implementation setzt allerdings voraus, dass man Suche in Wikipedia REKURSION verstanden hat. Vielleicht kommst du ja mit diesem Stichwort weiter.

Ich sehe allerdings nur einen begrenzten Sinn darin, bei dem bereits bekannten Problem "wie implementiert man Backtracking beim Sudoku" noch einen Thread auf zu machen, nur weil in dem "alten" keiner mehr geantwortet hat. Ob das jetzt mit einem "neuen" Thread besser wird, wage ich mal zu bezweifeln. Einen weiteren Thread hierzu werde ich schließen. :|

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Fr 27.03.09 19:45 
Es müsste auch ohne Backtracking gehen.
Für jedes Feld am Anfang eine Liste mit allen möglichen Zahlen erstellen. Wird in einem Feld eine Zahl gesetzt so werden in den Zellen jedes Unterelement(im klassischen 9x9 die kleinen 3x3 felder), sowie jeder Zeile und Spalte die entsprechende Zahl entfernt.

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt