Sudoku-Solver mit C



  • Hallo, ich hab in der Schule eine Aufgabe bekommen, wür mussen ein Sudoku-Solver programmieren in C.Also das Sudoku selbst wird aus Datei gelesen und dann auf BS gelöst ausgegeben.Und ich komme nicht weiter....Es werden irgendwelche Zahlen ausgegeben.

    #include<stdlib.h>
    #include<string.h>
    #include<stdio.h>
    int check (int,int,int);
    int versuch(int);
    void ausgabe();
    int matrix[9][9];
    FILE *datei;
    char datname[15];
    
    int check(int a, int b, int u) {
      int i,j;
      if ( matrix[a])       return 0;
      for (i = 0; i < 9; i++) { 
        if (u == matrix[a][i]) return 0;
        if (u == matrix[i][b]) return 0;
      }
      for ( i = a - a%3 ; i < a - a%3 + 3; i++) 
        for (j = b - b%3 ; j < b - b%3 + 3; j++)
          if (u == matrix[i][j])
    	return 0;
      return 1;
    }
    int versuche(int k) {  /* k --> k/9 k%9 */
      int i, q;
      while ( k<=80 && matrix[k/9][k%9] ) k++; /* naechstes freies Feld?  */
     //if ( k == 81 ) return 1;               /* alles belegt, fertig    */
      for ( q=0, i=1 ; q == 0 && i <= 9 ; i++) { 
        if ( check(k/9, k%9, i) ) {  /* teste das Feld k mit allen i    */
    	matrix[k/9][k%9] = i;
    	if (k == 80) q = 1;      /* falls letztes Feld, Erfolg: q=1 */
    	else                    
    	  if (  (q = versuche(k+1) ) == 0) /* sonst naechstes Feld  */
    	    matrix[k/9][k%9] = 0;  /* Falls erfolglos, Ruecksetzen    */
          }
      }
      return q;
    }
    
    int main()
    {
    int i,j,z;
    
    printf("Bitte Dateinamen der einzulesenden Datei eingeben!\n Eingabe: "); 
      scanf ("%s",datname);
    datei=fopen(datname,"r");
       if (datei==NULL)
           printf("Ffehler!Datei konnte nicht geöffnet werden!!:");
           printf("\nDer vorgegebene Sudoku aus Datei!!\n");
      do{                  
         for(i=0;i<9;i++)
             {   for(j=0;j<=9;j++)
                   { z=fgetc(datei);
                    printf ("|%c", z);
                    matrix[i][j]=z;
                   }                 
             }printf ("\nFertig\n");
             }    
      while ((z=fgetc(datei))!=EOF);
    versuche(0);
    ausgabe();
    return 0;
    }
    void ausgabe()
    {
    int i,j;
    
    printf("|-|-|-|-|-|-|-|-|-|\n");
            for (i=0;i<9;i++){
           for (j=0;j<=9;j++) {
             printf ("|%d", matrix[i][j]); }}      
             printf("\n\n----Fertig-----");     
    }
    

    **
    UNd die Datei sieht so aus:
    sudoku1.txt
    [b]090604750
    406000000
    700508609
    007402006
    860301074
    900705800
    502107008
    000000305
    083209010**

    Was ist falsch?ICh sitze schon 2 Tage und weiß nicht mehr wo ich suchen soll.



  • So weit reduzieren bis du wieder nachvollziehen kannst was überhaupt passiert.
    Oder nochmal alles von Grund auf durchgehen.



  • Das hier ist das C++ Subforum...

    Trotzdem:
    Kann es ein, dass du die Char-Werte der einzelnen Zahlen statt deren Zahlenwerte zum Rechnen benutzt?



  • Hab ich schon gemacht..Mit Debugger auch..Und bei Funktionsaufruf versuch(0) vermute ich dass er nicht die Werte selbst übergibt sondern nur adressen..Trotzdem weiß ich nicht, was ich da korrigiren soll. 😕



  • Du bist anscheinend noch zu wenig genau mit dem Debugger durchgegangen. Kontrollier doch mal die Werte der Variablen zur Laufzeit. Dann siehst du auch, wo etwas nicht mehr stimmt.

    P.S. Die Funktion versuche() hat einen int als Parameter, wie kommst du auf Adressen?



  • Ich habs!!! Vielen Dank für ihre Hilfe.Das PRoblem war (mit Debuger gefunden) bei Zeile 53.Da muss man noch den eingelesenen Wert aus ASCII in nummerischen Wert umwandeln.Und dann in matrix[i][j] schreiben...Es funktioniert!!!!
    🙂


Anmelden zum Antworten