Sudoku Löser - Hilfe



  • Hi Community,
    Ich bin dabei einen Sudokulöser zu programmieren und bräuchte eure Hilfe, da ich einen für mich nicht auffindbaren Fehler eingebaut habe.
    Ich habe mir hier schon oft Tipps geholt und hoffe ihr könnt mir hier weiterhelfen :)....

    Stats zu meinem Programm:
    - eine Funktion (bool erlaubt(int,int,int)) gibt true zurück wenn die gewünschte Zahl setzbar ist
    - das Sudoku ist in einem 2D-Array (feld[9][9]) festgehalten

    Bei Fragen bezüglich des sonstigen Programms oder was ich mir dabei gedacht hab
    einfach fragen....

    Der Code:

    void solverrowche(void)
    		 {
    			 bool unterbr = true;
    
    			 while (unterbr)
    			 {   unterbr = false;
    
    				 // Reihen
    				 for (int xrow = 0; xrow <= 8; xrow++)
    				 {   int arr[9] = {0,0,0,0,0,0,0,0,0};
    					 for (int yrow = 0; yrow <= 8; yrow++)
    					 {	 if (feld[xrow][yrow] == 0)
    						 {	 for (int n = 0; n <= 8; n++)
    							 {	 if(erlaubt(xrow, yrow, n+1))
    								 {	 arr[n]++;
    								 }
    							 } 
    						 }
    					 }
    					 for (int z = 0; z <= 8; z++)
    					 {	 if (arr[z] == 1)
    						 {	 for (int yagain = 0; yagain <= 8; yagain++)
    							 {	 if (feld[xrow][yagain] == 0)
    								 {  if (erlaubt(xrow, yagain, z+1))
    									{	 feld[xrow][yagain] = z+1;
    										 unterbr = true;
    										 eingesetzt = true;
    									}
    								 }
    							 }
    						 }
    					 }
    				 }
    
    			 } 
    		 }
    

  • Mod

    Benutze bitte die richtigen Tags!

    Was ist dein Fehler?

    Die zahlreichen Codewiederholungen mit jeweils winzigen Änderungen sind wahnsinnig anfällig für Tippfehler. Vielleicht ist es das schon. Fasse die Funktionalität in Funktionen zusammen, dann hast du nur noch ein paar übersichtliche Funktionsaufrufe, bei denen Tippfehler sofort auffallen.



  • Zum Programmablauf:
    Der gepostete Teil geht zuerst alle Reihen durch und bei jedem Leeren Feld (0) werden dort alle zahlen (1-9) durchgegangen und sollte eine einsetzbar sein wird diese stelle in einem separaten array um eins erhöht... nachdem eine Reihe durch ist wird überprüft ob eine zahl nur einmal einsetzbar ist... wenn ja wird die Reihe nochmal durchgegangen und die passende Stelle wird gesucht, wenn diese gefunden wurde wird die passende Stelle im Array feld[][] mit der richtigen Zahl überschrieben.



  • SeppJ schrieb:

    Die zahlreichen Codewiederholungen mit jeweils winzigen Änderungen sind wahnsinnig anfällig für Tippfehler. Vielleicht ist es das schon. Fasse die Funktionalität in Funktionen zusammen, dann hast du nur noch ein paar übersichtliche Funktionsaufrufe, bei denen Tippfehler sofort auffallen.

    Danke für den Tipp werd's nochmal genau durchgehen.

    SeppJ schrieb:

    Was ist dein Fehler?

    Das wüsste ich auch gerne das Programm macht einfach garnichts 😞


  • Mod

    LugyX schrieb:

    Das wüsste ich auch gerne das Programm macht einfach garnichts 😞

    Das stellst du wie fest? Was würdest du erwarten? Warum?

    Muss man dir alles aus der Nase ziehen? Lies dir bitte mal den ersten und den dritten Link in meiner Signatur gründlich(!) durch, wie du uns Informationen liefern kannst, die uns überhaupt in die Lage versetzen, dir helfen zu können.



  • Ich stelle das fest indem ich das array komplett ausgebe, in dem die Zahlen ergänzt werden sollen, aber da werden keine Zahlen ergänzt. (Sorry hätte ich mir vorher durchlesen sollen 😕 )
    => Ich hab das Array so modifizert dass die Funktion etwas finden muss (wenn sie funktionieren würde)
    Falls ich noch etwas wichtiges vergessen habe tut es mir im voraus leid (bin selten in foren unterwegs).

    Den Fehler kann ich nicht genau festmachen, da ich bisher die Fehlerausgabe von "VS2010 Ultimate" genutzt habe, diese gibt allerdings keinen einzigen Fehler aus. (was Schreibfehler bei Variablen / vergessene Semikolons oder Klammern fast komplett ausschließt)



  • Zu "Stell deine Fragen präzise. Mache deutlich, was du erreichen willst, was du bereits erreicht hast und wo aktuell dein Problem liegt."

    Ich möchte erreichen: Die Funktion soll zuverlässig die nötigen Zahlen einsetzen (wie im Sudoku erlaubt... heißt in zeile, spalte und dem 3x3 feld darf jede Zahl von 1-9 nur 1x eingesetzt werden)

    Ich habe bereits erreicht: Einfache Sudokus werden dank einfacherer Funktion gelöst. Eine Funktion überprüft ob eine Zahl an einer bestimmten Stelle einsetzbar ist. Ein Grundgerüst ist vorhanden welches aber nicht komplett funktioniert.

    Mein Problem: Es werden von der bereits geposteten Funktion keine Zahlen ergänzt.



  • @_LugyX_

    ich versteh in deinem beispiel nicht die rolle von bool unterbr:

    bool unterbr = true;
    
    while (unterbr)
    { unterbr = false; 
    }
    

    Die funktionsweise passt iwie nciht mit dem Namen überein! dem namen nach würde man vermuten, dass true bedeutet, etwas zu unterbrechen. du machst jedoch das gegenteil.

    und sonst so: bitte c/c++ tags benutzen UND ordentlich einrücken.
    bestimmt kommt gleich einer an und verschiebt dein das hier nach C (und nicht C++)



  • Habs geschafft ... lag an dem Aufruf der Funktion und nicht an der Funktion 😕


Anmelden zum Antworten