Autor |
Beitrag |
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 11.01.18 21:46
wie war das mit dem Formatieren? bitte bitte mach es
Mit folgendem Code würde theoretisch solange ein neues Spiel generiert und getestet, bis ein lösbares gefunden wurde, und dieses dann ausgegeben:
java code: C++-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public static void main(String[] args) {
int Matrix[][] = new int[9][9]; do { generiere(Matrix); for(int m=0; m<9; m++) { for(int n=0; n<9; n++) { Matrix[m][n]=0; } } } while(solve(0, 0, Matrix) == false); print(Matrix); } |
Wenn du mehrere generieren willst packst du eben die do-while Schleife und die Ausgabe in eine For-Schleife
_________________ 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: Do 11.01.18 22:28
Dabei ist nur das Problem,das wieder nur die Lösung ausgegeben wird. Deswegen wollte ich ja auch wie in meinem vorherigen Post das ganze Feld kopieren, was anscheinend nicht funktioniert.
PS: Beim nächsten Mal achte ich auf die Formatierung.
Zuletzt bearbeitet von LINUS19 am Do 11.01.18 22:31, insgesamt 1-mal bearbeitet
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 11.01.18 22:31
achso ja ich verstehe - dann musst du natürlich eine Kopie des generierten Feldes erstellen und ausgeben, wenn sie lösbar ist.
_________________ 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)
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 12.01.18 10:56
Überlege mal genau, wann du die Matrix kopierst! Und bedenke den guten Tipp bezüglich der do...while-Schleife.
Und du hättest die Lösung schon selbst gefunden, wenn du - wie ich schon schrieb - deinen Code strukturierter angehen würdest, d.h. die Matrixoperationen in eigene Methoden auslagern würdest.
Gehe einfach mal hin und schreibe den Algorithmus als Pseudo-Code auf...
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Fr 12.01.18 19:36
Jetzt werden 17 zufällige Zahlen ausgegeben und das mit dem kopieren funktioniert, aber es gibt nur einen Durchlauf der Schlaufe, weil wenn das Feld wieder komplett auf Null gesetzt wird,es dann ja für die solve () Methode lösbar ist. Und die Methode true zurück gibt und die while Schlaufe dann ja abbricht.
Zuletzt bearbeitet von LINUS19 am Fr 12.01.18 21:12, insgesamt 1-mal bearbeitet
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Fr 12.01.18 20:25
Mach doch bitte wirklich mal ein Pseudo-Code wie es TH90 schon 3x oder so vorgeschlagen hat. Das hilft dir und uns bestimmt mehr als deine kryptische Beschreibung eben ^^
wenn du nicht weißt was Pseudo-Code ist - schreib einfach hin was Zeile für Zeile gemacht werden soll, als ob du jede Zeile in deinem Quelltext kommentieren würdest.
_________________ 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: Fr 12.01.18 21:15
Naja ich meinte das wenn das Feld komplett wieder auf Null gesetzt wird , ist das Sudoku für die solve() Methode lösbar und dewegen läuft die while Schleife nur einmal durch und gibt eben nur ein zufällig generiertes Sudoku aus.
Was war in meiner Nachricht vorher den kryptisch?
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Sa 13.01.18 17:26
Das mit dem Sudoku generieren klappt jetzt, ich wollte aber noch erreichen das die Sudokus eindeutig lösbar sind. In meinem SudokuLöser habe ich die solve() Funktion, bei der Abbruchbedingung folgendendes verändert um alle Lösungen zu bekommen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| static int anzahl = 0; // Azahl der Lösungen für das Sudoku
static boolean solve(int i, int j, int Matrix[][]) { aufrufe++;
if (i == 9 && j == 8) { // unteres rechtes Feld erreicht anzahl++; System.out.println(anzahl); if (anzahl < 2) {
print(Matrix); System.out.println("Das S. ist nicht eindeutig: hier eine mögliche Lösung"); }
return false; // nach neuer Lösung wird gesucht } |
Das ganze funktionier, aber wenn ich das bei meinem Sudokugeneraator mache, also in der do- while Schleife
while(solve(0,0,Matrix)==false && anzahl>1) schreibe läuft die Schleife nur einmal durch und das Sudoku ist nicht lösbar.
LG
LINUS19
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Sa 13.01.18 17:31
Ich nehme mal an anzahl ist die Anzahl der Lösungen, warum prüfst du ob anzahl < 2 ist, und sagst dann, dass es nicht eindeutig ist, also mehrere Lösungen hat? Wenn es nicht eindeutig ist müsste doch anzahl > 1 sein, oder 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)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Sa 13.01.18 17:52
Stimmt, es muss anzahl >1 sein. Die do -while Schleife ist jetzt 10. Millionnen mal durchgelaufen und hat kein Sudoku ausgegeben.
Das kann doch nicht so viele Durchläufe brauchen, oder ?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Sa 13.01.18 17:54
du kannst dir ja einfach mal ausgeben lassen, wieviele Möglichkeiten es jeweils gam. Ich denke das kann durchaus sein, je nachdem, wieviele Startziffern du Anfänglich einträgst. Je weniger Ziffern du vorgibst, desto höher ist die Wahrscheinlichkeit, dass es viele Möglichkeiten gibt.
_________________ 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: Sa 13.01.18 18:16
Ich muss eben doch irgendwo noch einen Fehler gemacht haben , jetzt läuft die Schleife wieder nur einmal durch.
Symbroson hat folgendes geschrieben : | du kannst dir ja einfach mal ausgeben lassen, wieviele Möglichkeiten es jeweils gam. |
Was meinst du damit?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Sa 13.01.18 18:36
einfach von jedem Durchlauf anzahl in der Konsole ausgeben lassen
Apropos: setzt du anzahl irgendwo an einer sinvollen Stelle auf 0?
_________________ 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: Sa 13.01.18 19:12
anzahl setze ich am Ende der do Bedingung auf Null, aber ich verstehe immer noch nicht warum die Schleife nur einmal durchläuft.
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Sa 13.01.18 20:34
Hier nochmal die main Methode:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| public static void main(String[] args) {
int m; int n; int Matrix[][] = new int[9][9]; int Clone[][] = new int[9][9]; int a = 0;
do {
for (m = 0; m < 9; m++) { // Matrix wir wieder auf Null gesetzt for (n = 0; n < 9; n++) { Matrix[m][n] = 0; lösbar // ist
} } generiere(Matrix); System.out.println(anzahl); for (m = 0; m < 9; m++) { // Matrix wird kopiert for (n = 0; n < 9; n++) { Clone[m][n] = Matrix[m][n]; } } // print(Clone);
a++; System.out.println(a); anzahl = 0; } while (solve(0, 0, Matrix) == false && anzahl >1); // || print(Clone); System.out.println(a); } |
und wenn ich mir anzahl ausgeben lasse, wird immer Null gedruckt.
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: So 14.01.18 10:39
Natürlich ist anzahl immer null, weil die solve Methode zu dem Zeitpunkt wo du anzahl ausgibst noch garnicht aufgerufen wurde
_________________ 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)
Zuletzt bearbeitet von Symbroson am So 14.01.18 11:44, insgesamt 2-mal bearbeitet
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 14.01.18 11:40
LINUS' Bastelstunde... - mehr fällt mir dazu nicht mehr ein.
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: So 14.01.18 17:15
Das Problem bei der while Schleife ist, wenn ich wie weiter oben steht bei der solve() Methode immer false returne um alle Lösungen zuzählen, die while Schleife dann immer weiter läuft.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| static boolean solve(int i, int j, int Matrix[][]) { if (i == 9 && j == 8) { // unteres rechtes Feld erreicht anzahl++; System.out.println(anzahl)
return false; |
Zuletzt bearbeitet von LINUS19 am So 14.01.18 18:00, insgesamt 1-mal bearbeitet
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: So 14.01.18 17:24
Hier mal ein Vorschlag:
gebe bei solve() die Anzahl der Lösungsmöglichkeiten zurück
in deiner while-schleife oder wie auch immer prüfst du dann als abbruchbedingung, ob die zurückgegebe Anzahl = 1 ist. Zum debuggen speicherst du die Anzahl zwischen, gibst sie aus und dann kommt die while-abbruch-Bedingung
_________________ 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: So 14.01.18 18:05
Meintest du sowas ?
Quelltext 1: 2: 3: 4:
| static int solve(int i, int j, int Matrix [][]) { ... return anzahl; } |
|
|