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



BeitragVerfasst: Fr 20.03.09 19:40 
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.


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Fr 20.03.09 20:00 
ich schätze mal es liegt daran, dass du menes und mengew nie leerst
greendesire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 20.03.09 20:19 
doch das hab ich wohl vergessen hinzuschreiben.

hab vorher noch stehen
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
greendesire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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, das sah mir auf den ersten Blick ganz gut aus. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Sa 21.03.09 12:24 
user profile icongreendesire hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden 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?

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Ruffstaarr
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:
ausblenden 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....
Einloggen, um Attachments anzusehen!