Autor |
Beitrag |
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: So 14.01.18 18:14
ja.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: So 14.01.18 18:34
Aber wenn ich zum Beispiel diesen Teil der solve() Methode nehme :
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| for (int value = 1; value <= 9; value++) { // Alle Zahlen von 1-9 werde getestet
if (check(i, j, value, Matrix) == true) { // Gehe auf nächstes freies Feld Matrix[i][j] = value; // setze den Wert if (solve(i + 1, j, Matrix) == true) return true; } } |
Verstehe ich nicht wie ich das ganze umschreiben soll. Da wüde ja return anzahl; nicht viel Sinn ergeben.
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: So 14.01.18 18:39
wieso nicht
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 14.01.18 19:09
Hallo,
ich habe diesen Thread für 24h gesperrt. Dies soll Dir, Linus, Gelegenheit geben, Dir selbstständig grundsätzliche Gedanken zu Deinem Programm zu machen. Insbesondere den Hinweis, einfach mal in normalen Sätzen aufzuschreiben, was Dein Programm Schritt für Schritt tun soll, halte ich für sinnvoll. Es kann hier nicht so weiter gehen, wie bisher, dass Du völlig planlos Dinge ausprobierst und dann fragst, warum es nicht geht.
Der Thread entsperrt sich in 24h von selbst.
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Für diesen Beitrag haben gedankt: FinnO, LINUS19, Symbroson, Th69
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Mo 15.01.18 20:06
Ich habe jetzt in der Abbruchbedingung while ( solve(0, 0,Matrix)<1 ); , es werden also solange Sudoku generiert bis es mehr als eine Lösung hat. z.b kommt jetzt nach 9 Schleifen Durchläufen das hier:
63 Lösungen // Lösungen Die anzahl der Lösungen wird auch richtig gezählt.
802100000
400063000
090085074
200000050
080000000
500000007
005700009
010002000
009408300
Aber wenn ich jetzt while ( solve(0, 0,Matrix)>1 ); als abbruchbedingung habe, also so lange suche bis es nur eine Lösung gibt, läuft die Schleife nur einmal durch. ( um unlösbare Sudokus wegzunehmen Quelltext 1: 2:
| if(anzahl==0) continue; // unlösbare Sudokus werden wegelassen | )
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 15.01.18 20:10
Zitat: | while ( solve(0, 0,Matrix)<1 ); , es werden also solange Sudoku generiert bis es mehr als eine Lösung hat |
denk darüber nochmal nach. du durchläufst die Schleife, solange die Anzahl der Lösungen kleiner als 1 ist.
Zitat: | C++-Quelltext 1: 2: 3:
| while ( solve(0, 0,Matrix)>1 ); if(anzahl==0) continue; | |
warum nicht einfach while(solve(..) != 1) ?!
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Mo 15.01.18 20:41
Symbroson hat folgendes geschrieben : | Zitat: | while ( solve(0, 0,Matrix)<1 ); , es werden also solange Sudoku generiert bis es mehr als eine Lösung hat | denk darüber nochmal nach. du durchläufst die Schleife, solange die Anzahl der Lösungen kleiner als 1 ist |
Verstehe ich nicht so ganz ,es hat doch 63 Lösungen.
Mit =! 1 funktioniert es wenn ich z.B 25 als vorgegebe Zahlen mache, aber wenn ich jetzt 17 eingebe, hängt sich das Programm nach einem Durchlauf auf, es rechnet noch ( man kann auf terminate klicken) aber es passiert dann auch nichts mehr.Liegt das daran das zu viele Sachen durchgerechnet werden müssen, weil bei 17 Zahlen kann es ja sehr viele Lösungsmöglichkeiten geben?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 15.01.18 20:59
nochmal.
1.
was du willst: solange Sudokus generieren bis eines mehr als eine Lösung hat
dein code: while ( solve(0, 0,Matrix)<1 );
was er tut: lösen, solange es weniger als eine Lösung gibt.
was bedeutet das in der solange-bis Bedingung?
Fällt dir zwischen gewolltem und passierendem ein gewisser Unterschied auf?
2.
du sagst, dass du solange suchst bis es nur eine Lösung gibt
gibst aber als code an while ( solve(0, 0,Matrix) > 1 );
das Heißt in dem Falle, dass du alle Zahlen kleiner gleich eins, also auch 0 mit einschließt.
Das fixt du, indem du folgendes tust: if(anzahl==0) continue;
das ist aber eigentlich unnötig, wenn du gleich prüfst, ob anzahl == 1 und dann abbrichst, also solange anzahl != 1
Ansonsten verstehe ich irgendetwas an deiner Umsetzung nicht, vmtl weil ich nicht den gesamten Quelltext kenne.
Mal davon abgesehen: Hast du dir denn jetzt erstmal überlegt, wie die Grundstruktur deines Programmes aussehen soll? Sprich einen Pseudo-Code geschrieben? Dann haben wir wenigstens alle ein Muster nach dem wir uns richten können, was die Hilfe ungemein vereinfachen könnte.
Bitte ignoriere das nicht schon wieder - sonst habe auch ich keine Lust mehr dir hier zu helfen. Das ist nicht böse gemeint oder so, sondern du machst es einem echt schwer dir helfen zu können.
Danke.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Mo 15.01.18 21:24
Es funktioniert jetzt doch schon, z.b nach 699 Durchläufen mit 25 Zahlen bekomme ich folgendes Sudoku(dauert aber ziemlich lange):
900000047
310700020
004008000
470900050
000064000
208000000
000207600
090000300
000036001
Und das ist laut meinem Sudoku Löser eindeutig lösbar. Wofür brauche ich dann noch den Pseudotext?
Ich meinte ja nur das es sich bei kleineren Zahlen wie z.B 17 "aufhängt" und zu keiner Ausgabe kommt wie ich weieter oben schon geschrieben habe.
Oder verstehe ich dich gerade völlig falsch?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 15.01.18 21:59
Zitat: | Ich meinte ja nur das es sich bei kleineren Zahlen wie z.B 17 "aufhängt" und zu keiner Ausgabe |
Ich glaube auch schonmal erwähnt zu haben, dass die Anzahl der Lösungsmöglichkeiten steigt, je weniger Zahlen du vorgibst. Höchstwahrscheinlich mehrfach exponentiell - das kann man so ohne weiteres nicht herleiten.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Mo 15.01.18 22:21
Eine Frage hätte ich noch:
Ich wollte noch verschiedene Schwierigkeitsgrade machen, aber die Schwierigkeit hängt ja nicht nur von der Anzahl der vorgegebenen Zahlen ab, würde es unterschiedlich schwierig sein wenn ich die Schwierigkeit in Abhängigkeit von der Anzahl der Methodenaufrufe mache, oder was gibt es noch für Möglichkeiten?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 15.01.18 22:27
Ich vermute, dass es schwieriger wird, je mehr Lösungsmöglichkeiten es gibt, denn viele Möglichkeiten bedeutet, dass es in vielen Feldern mehrere Ziffern zur Auswahl gibt, die folglich erst relativ spät ausgefüllt werden könnten.
Du darfst es aber auch nicht übertreiben
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Mo 15.01.18 22:35
Was meinst du übertreiben?
Die Schwierigkeit einfach zufällig lassen?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 15.01.18 22:38
Nein, zu wenige Ziffern vorgeben.
Ich hoffe das Thema hat sich damit erledigt
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
|