Autor Beitrag
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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:
ausblenden 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);
    
    // Matrix wir wieder auf Null gesetzt
    for(int m=0; m<9; m++) {    
      for(int n=0; n<9; n++) {
        Matrix[m][n]=0;
      }
    }
  } while(solve(00, 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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.

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
du kannst dir ja einfach mal ausgeben lassen, wieviele Möglichkeiten es jeweils gam.
Was meinst du damit?
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Sa 13.01.18 20:34 
Hier nochmal die main Methode:
ausblenden volle Höhe Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 14.01.18 11:40 
LINUS' Bastelstunde... - mehr fällt mir dazu nicht mehr ein. :?!?:
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 14.01.18 18:05 
Meintest du sowas ?
ausblenden Quelltext
1:
2:
3:
4:
static int solve(int i, int j, int Matrix [][]) {
...
return anzahl;
}