Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - sudoku füllen mithilfe von mengen


greendesire - Fr 20.03.09 19:40
Titel: sudoku füllen mithilfe von mengen
ich programmiere grad Sudoku und habe es jetzt geschafft, dass das sudoku in den senkrechten spalten zahlen von 1-9 enthält, die nicht doppelt sind.
allerdings sind dann die zahlen in den waagerechten Zeilen doppelt.
ich bekomme irgendwie immer eine endlosschleife.
kann mir irgendwer sagen, was ich falsch mache?

hier der quelltext mit der endlosschleife, wenn man das mit (zahl in mengew[j]) und mengew[j]:=mengew[j]+[zahl]; weglässt, funktioniert es immerhin für die senkrechten.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var mengeS,mengeW: array[0..8of set of byte;
.
.
.
with Stringgrid1 do
  Begin

  for i:=0 to 8 do
  Begin
    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]) or (zahl in mengew[j]));
      menges[i]:=menges[i]+[zahl];
      mengew[j]:=mengew[j]+[zahl];
     end;
   end;
   end;


Jann1k - Fr 20.03.09 20:00

ich schätze mal es liegt daran, dass du menes und mengew nie leerst


greendesire - Fr 20.03.09 20:19

doch das hab ich wohl vergessen hinzuschreiben.

hab vorher noch stehen

Delphi-Quelltext
1:
2:
3:
4:
for i:=0 to 8 do
 menges[i]:=[];
for j:=0 to 8 do
 mengew[j]:=[];

ich weiß nur, dass es passieren kann, wenn er zufällig zahlen einfügt, kann irgendwann das problem entstehen, dass z.b. wenn die zeile 123 456 78x ist aber in der senkrechten zeile die fehlende 9 schon vorkommt, er endlos eine zahl sucht, die da reinpasst aber nicht finden kann, da die 9 ja dann schon in der senkrechten zeile ist

aber ich weiß nicht wie ich verhindern kann, dass das passiert

lg

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Narses - Fr 20.03.09 20:24

Moin und :welcome: im Forum!

Diese Probleme löst man mit Suche in: Delphi-Forum, Delphi-Library BACKTRACKING. :idea: :les: :think: ;)

cu
Narses


greendesire - Fr 20.03.09 20:45

ok danke ich werds mal versuchen :)

EDIT: hab grad mal gegoogelt und auch im forum gesucht.
kann mir vllt jemand einen gutebn link geben, der die backtracking-methode allgemein erläutert?
lg


Narses - Sa 21.03.09 01:17

Moin!

user profile icongreendesire hat folgendes geschrieben Zum zitierten Posting springen:
kann mir vllt jemand einen gutebn link geben, der die backtracking-methode allgemein erläutert?
Schau mal hier rein [http://de.wikipedia.org/wiki/Backtracking], das sah mir auf den ersten Blick ganz gut aus. ;)

cu
Narses


der organist - Sa 21.03.09 12:24

user profile icongreendesire hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var mengeS,mengeW: array[0..8of set of byte;
.
.
.
with Stringgrid1 do
  Begin

  for i:=0 to 8 do
  Begin
    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]) or (zahl in mengew[j]));
      menges[i]:=menges[i]+[zahl];
      mengew[j]:=mengew[j]+[zahl];
     end;
   end;
   end;


soweit ich weiss, werden in Sudoku nur die Zahlen von 1 bis 9 verwendet. Deine Zufallszahl geht aber von 1 - 10. Oder versehe ich mich da?


Narses - So 22.03.09 14:13

Moin!

user profile iconder organist hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongreendesire hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
cells[i,j]:=IntToStr(random(9)+1);                    
soweit ich weiss, werden in Sudoku nur die Zahlen von 1 bis 9 verwendet. Deine Zufallszahl geht aber von 1 - 10. Oder versehe ich mich da?
Das ist schon ganz OK so, Random(9) liefert 0..8, das Ganze um 1 verschoben: 1..9. ;)

cu
Narses


Ruffstaarr - Mi 01.04.09 09:04

Hallo
also ich verstehe das Problem der ganzen Sache nicht so recht.
habe vorher Turbo Pascal Programmiert, und jetzt mit Delphi Angefangen.
gefällt mir ganz gut und die Umstellung ist auch recht "heimisch"...
werde die Datei mal anhängen...
also um auf dein Problem zurückzukommen:
du musst doch Sowieso soetwas wie eine Kandidatenliste haben...
dann könntest du doch mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
Speicher: set of string;
for i:1 to 9 do
begin
  if IntToStr(i) in Kandidat[x,y] then
    begin
     include(Speicher, i)
    end  
      randomize...choose aus Speicher

oder geht das in Delphi nicht?
bin auch gerade Dabei, dieses Sodoku in Delphi umzuwandeln,
habe aber noch Probleme Die Labels als Array zu behandeln....
ansonsten muss ich wahnsinnig viel Quelltext tippen.
wäre da für Hilfe Dankbar

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

uups
jetzt hatte ich dch glatt mei Sodoku Programm Vergessen....