Sudokulöser ohne globale Variablen



  • Hi,
    ich habe die Aufgabe bekommen einen Sudokulöser in C zu programmieren.
    Soweit ganz ok. Allerdings stehe ich vor 2 Problemen.
    1. soll ich das benutzen von globalen Variablen vermeiden
    und 2. Der Zeilentrenner kann Windows (<CR><LF>) oder Linux (<LF>) sein.
    Ich hatte den Löser schon einmal mit globalen Variablen laufen und habe ihn versucht umzuschreiben. Allerdings liefert er mir nach dem umschreiben keine richtigen lösungen, sondern nur minuszahlen.
    Ich hänge hier mal schnell meinen code an :

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int readfile(char outfile[50],int *feld);
    void Spielfeld(int *feld);
    int checkall(int x, int y, int wert, int *feld);
    int checkX(int y, int wert, int *feld);
    int checkY(int x, int wert, int *feld);
    int checkBOX(int x, int y, int wert, int *feld);
    int loesen(int x, int y, int *feld);
    
    int loesungen = 0;
    
    int main(){
      char outfile[50];
      int feld[9][9];
    
      printf("Welches Sudoku soll geloest werden?\n");
      scanf("%s", &outfile);
      if(readfile(outfile, &feld[0][0]) < 0)
            return -1;
      Spielfeld(&feld[0][0]);
      loesen(0, 0, &feld[0][0]);
    
      return 0;
    
    }
    
    int readfile(char outfile[50],int *feld){
      FILE *fp;
      int i, j;
      char temp[9+3] = {0};
    
      if((fp = fopen(outfile, "rb")) == NULL) {
        printf("Datei %s nicht gefunden!\n", outfile);
        return -1;
      }
    
      for(i = 0; i < 9; i++) {
        if(fgets(temp, 9 + 3, fp) == NULL) {
          printf("Daten nicht vollstaendig!\n");
          fclose(fp);
          return -1;
        }
        for(j = 0; j < 9; j++) {
          *(feld+i*9+j) = temp[j] - '0';
        }
      }
    
      fclose(fp);
    
      return 0;
    }
    void Spielfeld(int *feld){
        int z, s;
    
        for(z = 0; z < 9; z++){
            for(s = 0; s < 9; s++){
                printf("%d", *(feld+z*9+s));
            }
        printf("\n");
        }
    }
    
    int checkall(int x, int y, int wert, int *feld){
        if(checkX(y, wert, &feld))
            return 1;
        if(checkY(x, wert, &feld))
            return 1;
        if (checkBOX(x, y, wert, &feld))
            return 1;
        return 0;
    
    }
    
    int checkX(int y, int wert, int *feld){
        int s;
    
        for(s=0; s < 9; s++)
            if((*(feld+y*9+s)) == wert)
                return 1;
            return 0;
    
    }
    
    int checkY(int x, int wert, int *feld){
        int z;
    
        for(z=0; z < 9; z++)
            if((*(feld+z*9+x)))
                return 1;
            return 0;
    
    }
    
    int checkBOX(int x, int y, int wert, int *feld){
        int boxstartX, boxstartY, z, s;
    
        boxstartX = (x/3)*3;
        boxstartY = (y/3)*3;       
    
        for(z=boxstartY; z < boxstartY + 3; z++)
            for(s=boxstartX; s < boxstartX + 3; s++)
                if((*(feld+z*9+s)) == wert)
                    return 1;
        return 0;
    }
    
    int loesen(int x, int y, int *feld){
        int i;
    
        if(x == 9){
            y++;
            x = 0;
            if(y = 9)
                return 1;
        }
        if((*(feld+y*9+x)) > 0)
            return loesen(x+1, y, &feld);
    
        for(i = 1; i <= 9; i++) {   
            if(!checkall(x, y, i, &feld)) {      
            *(feld+y*9+x) = i;
    
                Spielfeld(&feld);
                printf("\n");       
    
            }
        }
        return 0;
    }
    

    Wäre lieb wenn mir jemand helfen könnte 🙂
    gruß



  • Beim schnellen durchlesen fällt auf dass du in "loesen" die Adresse eines Zeigers anstatt den Zeiger selbst übergibst? Glaube nicht dass das so gewollt ist..



  • #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int readfile(char outfile[50],int *feld);
    void Spielfeld(int *feld);
    int checkall(int x, int y, int wert, int *feld);
    int checkX(int y, int wert, int *feld);
    int checkY(int x, int wert, int *feld);
    int checkBOX(int x, int y, int wert, int *feld);
    int loesen(int x, int y, int *feld);
    
    int loesungen = 0;
    
    int main(){
      char outfile[50];
      int feld[9][9];
    
      printf("Welches Sudoku soll geloest werden?\n");
      scanf("%s", &outfile);
      if(readfile(outfile, &feld[0][0]) < 0)
            return -1;
      Spielfeld(&feld[0][0]);
      loesen(0, 0, &feld[0][0]);
    
      return 0;
    
    }
    
    int readfile(char outfile[50],int *feld){
      FILE *fp;
      int i, j;
      char temp[9+3] = {0};
    
      if((fp = fopen(outfile, "rb")) == NULL) {
        printf("Datei %s nicht gefunden!\n", outfile);
        return -1;
      }
    
      for(i = 0; i < 9; i++) {
        if(fgets(temp, 9 + 3, fp) == NULL) {
          printf("Daten nicht vollstaendig!\n");
          fclose(fp);
          return -1;
        }
        for(j = 0; j < 9; j++) {
          *(feld+i*9+j) = temp[j] - '0';
        }
      }
    
      fclose(fp);
    
      return 0;
    }
    void Spielfeld(int *feld){
        int z, s;
    
        for(z = 0; z < 9; z++){
            for(s = 0; s < 9; s++){
                printf("%d", *(feld+z*9+s));
            }
        printf("\n");
        }
    }
    
    int checkall(int x, int y, int wert, int *feld){
        if(checkX(y, wert, feld))
            return 1;
        if(checkY(x, wert, feld))
            return 1;
        if (checkBOX(x, y, wert, feld))
            return 1;
        return 0;
    
    }
    
    int checkX(int y, int wert, int *feld){
        int s;
    
        for(s=0; s < 9; s++)
            if((*(feld+y*9+s)) == wert)
                return 1;
            return 0;
    
    }
    
    int checkY(int x, int wert, int *feld){
        int z;
    
        for(z=0; z < 9; z++)
            if((*(feld+z*9+x)))
                return 1;
            return 0;
    
    }
    
    int checkBOX(int x, int y, int wert, int *feld){
        int boxstartX, boxstartY, z, s;
    
        boxstartX = (x/3)*3;
        boxstartY = (y/3)*3;       
    
        for(z=boxstartY; z < boxstartY + 3; z++)
            for(s=boxstartX; s < boxstartX + 3; s++)
                if((*(feld+z*9+s)) == wert)
                    return 1;
        return 0;
    }
    
    int loesen(int x, int y, int *feld){
        int i;
    
        if(x == 9){
            y++;
            x = 0;
            if(y = 9)
                return 1;
        }
        if((*(feld+y*9+x)) > 0)
            return loesen(x+1, y, feld);
    
        for(i = 1; i <= 9; i++) {   
            if(!checkall(x, y, i, feld)) {      
            *(feld+y*9+x) = i;
    
                Spielfeld(feld);
                printf("\n");       
    
            }
        }
        return 0;
    }
    

    habs geändert 🙂



  • Warum übergibst du "Spielfeld" keinen int** und greifst dann mit [z][s] darauf zu? Naja sich das alles haarklein durchzulesen ist nicht sonderlich spaßig, denke mal Du bekommst schneller Abhilfe wenn Du den Zeitpunkt an dem etwas schief geht raus fischst (debugger/debugausgabe mit printf) und dann eine konkretere Frage stellst.



  • Wo ist denn bei checkY der Vergleich auf wert abgeblieben?


Anmelden zum Antworten