Sudokusolver - Ergebnis in .txt speichern



  • Hallo liebe Programmiergemeinde,

    wir haben die aufgabe einen Sudokusolver zu entwickeln, der das gelöste Sudoku dann als Textdatei ausgibt. Ich hab mir mnun viel dazu durchgelesen, aber finde einfach keine Lösung wie ich das einfügen kann.

    dass hier sollte der interessante part sein

    int main() {
      char pfad[200];
    
      printf("Bitte geben sie den Pfad zu dem Sudoku an:\n");
      scanf("%s", pfad);
      if(createSudoku(pfad) < 0)
    		return -1;
    
      printf("### Eingelesenes Sudoku: ###\n");
      printSudoku();
        fprintf(fp, "\n###################\n");
      solve(0, 0);
     printf("\nLoesungen: %d\n", loesungen);
    
      // Programm durch enter schließen
      fflush(stdin);
      getchar();
      return 0;
    
    }
    

    ich hatte bis dato 3-4 versuche, die sind alle fehlgeschlagen. Ich komm damit solangsam unter zeitdruck (muss das morgen abgeben) und verzweifel solangsam. Wäre für jeden Tipp oder gar ne Lösung des Problems echt dankbar. Danke im vorraus schonma jedem der helfen möchte 🙂

    Lg Xans
    p.s. (falls es was bringt oder ihr das braucht: der komplette code hier.)

    #include "stdafx.h"
    
    #include <stdio.h>
    // Definieren der Sudoku Feldgröße
    #define G 9 
    static int feld[G][G];
    static int loesungen = 0;
    
    int createSudoku(char *dateiname);
    void printSudoku();
    int solve(int x, int y);
    int checkBox(int x, int y, int wert);
    int checkVertical(int x, int wert);
    int checkHorizontal(int y, int wert);
    int check(int x, int y, int wert);
    
    //Lösungsweg angeben: Horizontal, Vertikal und in 3x3 Boxxen leere Felder finden
    int check(int x, int y, int wert) {
      if(checkHorizontal(y, wert))
        return 1;
      if(checkVertical(x, wert))
        return 1;
      if(checkBox(x, y, wert))
        return 1;
      return 0;   
    }
    //Leere Felder (0) in der Horizontalen finden
    int checkHorizontal(int y, int wert) {
      int i;
      for(i = 0; i < G; i++)
        if(feld[y][i] == wert)
          return 1;
      return 0;
    }
    //Leere Felder (0) in der Vertikalen finden
    int checkVertical(int x, int wert) {
      int i;
      for(i = 0; i < G; i++)
        if(feld[i][x] == wert)
          return 1;
      return 0;
    }
    
    //Leere Felder (0) in den 3x3 Boxxen finden.
    int checkBox(int x, int y, int wert) {
      int x_box, y_box, i, j;
      x_box = (int)(x / 3) * 3;
      y_box = (int)(y / 3) * 3;
      for(i = y_box; i < y_box + 3; i++)
        for(j = x_box; j < x_box + 3; j++)
          if(feld[i][j] == wert)
            return 1;
      return 0;
    }
    // Zahlen in leere Felder einsetzen, durch probieren die Lösung finden.
    int solve(int x, int y) {
      int i;
      if(x == G) {                 
        y++;
        x = 0;
        if(y == G)                 
          return 1;
      }   
    
      if(feld[y][x] > 0)           
        return solve(x+1, y);      
    
      for(i = 1; i <= G; i++) {    
        if(!check(x, y, i)) {     
          feld[y][x] = i;          
    	    if(solve(x+1, y)) {      
            loesungen++;           
            printf("Loesung %d:\n", loesungen);
    		    printSudoku();
    		    printf("\n");
    
    	    }
        }
      }
    
      feld[y][x] = 0;              
      return 0;
    }
    //ausgegebene Sudokustruktur definieren
    void printSudoku() {
      int i, j;
      for(i = 0; i < G; i++) {
        for(j = 0; j < G; j++) {
          printf("%d", feld[i][j]);
        }
        printf("\n");
      }
    }
    
    //Datei einlesen
    int createSudoku(char *dateiname) {
      FILE *fp;
      int i, j;
      char temp[G+3] = {0};
    
      if((fp = fopen(dateiname, "r")) == NULL) {
        printf("Datei %s nicht gefunden!\n", dateiname);
        return -1;
      }
    
      for(i = 0; i < G; i++) {
        if(fgets(temp, G + 3, fp) == NULL) {
          printf("Daten nicht vollstaendig!\n");
          fclose(fp);
    			return -1;  
        }
        for(j = 0; j < G; j++) {
          feld[i][j] = temp[j] - '0';
        }
      }
    
      fclose(fp);
    
      return 0;
    }
    // Sudoku durch Pfad eingabe einlesen
    int main() {
      char pfad[200], filename[255];
    
      printf("Bitte geben sie den Pfad zu dem Sudoku an:\n");
      scanf("%s", pfad);
      if(createSudoku(pfad) < 0)
    		return -1;
    
      printf("### Eingelesenes Sudoku: ###\n");
      printSudoku();
        fprintf(fp, "\n###################\n");
      solve(0, 0);
     printf("\nLoesungen: %d\n", loesungen);
    
      // Programm durch enter schließen
      fflush(stdin);
      getchar();
      return 0;
    
    }
    


  • Da bist du wohl nicht der einzige, einer deiner Klassenkameraden (vielleicht) hat das schon im C Forum gepostest. Du hast dich aber ins C++ Forum verirrt.

    Außerdem hast du nicht beschrieben was denn nicht funktioniert!

    Edit: Der Code den du gepostet hast ist ja nicht mal von dir! Das bekommt man nach 1 Sekunde Googlen.



  • Nur mal eine kurze frage:
    Müsste man das nich viel komplizierter schreiben um ein wirkliches Sudoku zu bekommen? Da müsste ja in jeder Zeile jede Zahl von 1-9 einmal vorkommen... oder ist das hier schon impletiert und ich seh das nich? Meiner Meinung nach müsste man das eher Zahlenrätsel nennen xD



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Eine konkrete Aussage, was denn nicht funktioniert wäre sicher hilfreich.



  • int main() {
      char pfad[200];
    
      printf("Bitte geben sie den Pfad zu dem Sudoku an:\n");
      scanf("%s", pfad);
      if(createSudoku(pfad) < 0)
    		return -1;
    
      printf("### Eingelesenes Sudoku: ###\n");
      printSudoku();
        printf("\n###################\n");
      loesen(0, 0);
    	printf("\nLoesungen: %d\n", loesungen);
    
     FILE *fp;
     fp = fopen("sudoku_geloest.txt", "w");
     fprintf(fp, "%s", loesen(0, 0));
     fclose(fp);
    
      fflush(stdin);
      getchar();
      return 0;
    

    so nochmal genauer:
    ich hab das nochma ein wenig umgeschrieben mithilfe meiner unterlagen. Folgendes Problem habe ich nun:
    Das Sudoku wird vorher eingelesen und gelöst. Auf meiner Konsole habe ich dann die Lösung stehen. Diese Lösung probiere ich nun als txt datei auszugeben.
    Bei dem Code den ich gerade drinstehen hab, bekommen ich leider nicht die ausgegebene Lösung in die Textdatei, sondern nur den (Null) wert der lösung. D.h. mein Problem ist, dass ich das gelöste Sudoku nicht in die Textdatei bekomme.

    Danke fürs verschieben und danke für die hilfe an alle.

    ps. jaa es ist ein rumprobieren, aber mit unserem bzw. meinem derzeitigen wissen geht nichts besseres.



  • Findest du es nicht merkwürdig, dass in deiner Main variablen und Funktionen stehen, die du nie zuvor gepostet hast?

    Aber nein, mich wundert es nicht, wenn man jemanden hat, der den Code von dieser Seite: " http://www.daniel-brettschneider.de/?p=43 " komplett kopiert und dann einfach rät wie er den zweiten Teil seiner Hausaufgabe lösen kann.



  • Lies ein C-Buch! (Buch aus Papier, kannst du überall lesen.

    Dann schreibe printsudoko() so um, dass es auch in eine Datei schreiben kann.
    Oder schau in printsudoko() wie es dort gemacht wird.



  • Mal abgesehen, von der Tatsache, dass du bislang wohl nichts an deiner Hausaufgabe selbst geleistet hast: "Wer printf verwenden kann kann auch fprintf verwenden!!!!!"


Anmelden zum Antworten