Sudoku Teil STück (noch ohne Backtracking)



  • Hallo,

    ich hab hier ein Programm, dass in einer 9x9 Matrix (Sudoku) zulässige Zahlen in einem bestimmten Feld anzeigt.
    Ich habe das Programm fast komplett selber geschrieben, bis auf 1 Sache und die versteh ich jetzt nicht:

    und zwar zuersteinmal fopen:
    fopen sudoku.txt (Zeile 168)
    normalerweise wird doch, wenn so ein befehl kommt, die datei angelgt bzw muss angelegt sein, wie kann es aber sein, dass er die Matrix ausgibt, die bei int sudoku[9][9] eingeben worden ist, wird da irgendwo die Matrix in eine sudoku.txt eingespeichert?
    macht das eventuell die funktion fscanf von der DOS box?
    das wundert mich ein bisschen wie das funktioniert 😕

    Vielen Dank für Erklärungen

    #include <stdio.h>
    #include <stdlib.h>
    
    int sudoku [9][9] ={{3,0,5,2,1,4,6,7,8},
                        {4,1,2}
                            };
    int solution[9][9];
    
    int test_value(int x, int y, int value)
    {
    //printf("X = %d\n",x);
    	int i, j;
    // ### Zeile und Spalte
    	for ( i=0; i<9; i++ )
        {
            if( value == solution[i][x] || value == solution[y][i] )
            {
            return 0;
            }
    	}
    
    // ### Linke Spalte ###
    	if( x<3 )
        {
             // oberer Quadrand
             if(y<3)
             {
                   for(i=0; i<3; i++)
                   {
                        for(j=0; j<3; j++)
                        {
                             if( solution[i][j] == value ) return 0;
                        }
                   }
             }
             // mittlerer Quadrand
             else if( y>=3 && y<6 )
             {
                   for(i=0; i<3; i++)
                   {
                        for(j=3; j<6; j++)
                        {
                             if( solution[j][i] == value ) return 0;
                        }
                   }
             }
             // unterer Quadrand
             else if( y>5 )
             {
                  for(i=0; i<3; i++)
                   {
                        for(j=6; j<9; j++)
                        {
                             if( solution[j][i] == value ) return 0;
                        }
                   }
             }
        }
    // ### Mittlere Spalte ###
        else if( x>=3 && x<6 )
        {
            // oberer Quadrand
             if(y<3)
             {
                   for(i=3; i<6; i++)
                   {
                        for(j=0; j<3; j++)
                        {
                             if( solution[j][i] == value ) return 0;
                        }
                   }
             }
             // mittlerer Quadrand
             else if( y>=3 && y<6 )
             {
                   for(i=3; i<6; i++)
                   {
                        for(j=3; j<6; j++)
                        {
                             if( solution[i][j] == value ) return 0;
                        }
                   }
             }
             // unterer Quadrand
             else if( y>5 )
             {
                  for(i=3; i<6; i++)
                   {
                        for(j=6; j<9; j++)
                        {
                             if( solution[i][j] == value ) return 0;
                        }
                   }
             }
        }
    // ### rechte Spalte ###
    else if( x>=6 && x<9 )
        {
            // oberer Quadrand
             if(y<3)
             {
                   for(i=6; i<9; i++)
                   {
                        for(j=0; j<3; j++)
                        {
                             if( solution[j][i] == value ) return 0;
                        }
                   }
             }
             // mittlerer Quadrand
             else if( y>=3 && y<6 )
             {
                   for(i=6; i<9; i++)
                   {
                        for(j=3; j<6; j++)
                        {
                             if( solution[i][j] == value ) return 0;
                        }
                   }
             }
             // unterer Quadrand
             else if( y>5 )
             {
                  for(i=6; i<9; i++)
                   {
                        for(j=6; j<9; j++)
                        {
                             if( solution[i][j] == value ) return 0;
                        }
                   }
             }
        }
        return value;
    }
    
    void display(void)
    {
    
    	int i,j;
    	for (i = 0; i < 9; i++)
        {
    		for (j = 0; j < 9; j++)
            {
    			printf("%d ", solution[i][j]);
    		}
    		printf("\n");
    			}
    }
    
    int main()
    {
    	int i,j;
    	FILE * pFile;
    	printf("Eingabe aus .txt \n");
    	pFile = fopen ("sudoku.txt","r+");
    	for (i = 0; i < 9; i++)
        {
    		fscanf (pFile, "%d %d %d %d %d %d %d %d %d",
    				&sudoku[i][0],&sudoku[i][1], &sudoku[i][2],
    				&sudoku[i][3],&sudoku[i][4], &sudoku[i][5],
    				&sudoku[i][6],&sudoku[i][7], &sudoku[i][8]);
    	}
    	fclose (pFile);
    
    	for (i = 0; i < 9; i++)
        {
    		for (j = 0; j < 9; j++)
            {
    			solution[i][j] = sudoku[i][j];
    		}
    	}
    
    	display();
    	printf("Eingabe des zu pruefenden Punktes\nwelche Spalte?-> ");
    	int x, y;
        scanf("%d",&x);
        printf("\nWelche Zeile?-> ");
        scanf("%d",&y);
        y=y-1;
        x=x-1;
        printf("\nZulaessige Werte: ");
        int z;
        for(z=0; z<10; z++)
        {
            if( test_value(x, y, z) != 0)
            {
                printf("%d, ",test_value(x, y, z) );
            }
        }
        getchar();
        getchar();
    	printf("\n");
        return 0;
    }
    


  • Die Datei wird nur im Schreibfall angelegt, ist sie beim Lesen nicht vorhanden, wird der FILE* zu NULL, und wenn Du dann trotzdem damit weiterarbeitest (fscanf), dann passieren zumindest mal unvorhersehbare Dinge.



  • okay, aber r+ ist doch schreiben und lesen?
    in welcher Zeile steht geschrieben, dass er mir diese Matrix ausgibt, die ganz am anfang vom programm geschrieben steht, also die sudoku[9][9]?

    Dos fenster:

    Eingabe aus .txt
    3 0 5 2 1 4 6 7 8
    4 1 2 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0
    Eingabe des zu pruefenden Punktes
    welche Spalte?-> 2

    Welche Zeile?-> 1

    Zulaessige Werte: 9,

    Process returned 0 (0x0) execution time : 10.501 s
    Press any key to continue.



  • omg.. hat sich erledigt... sudoku wird ja solution zugewiesen....

    thx 🙂



  • Hallo chin842,

    hast du deinen Sudoku Löser auch mit Backtracking?
    Wäre echt super nett, wenn du den noch reinstellen könntest.

    Danke



  • Hi,

    ich hab auch einen Sudokulöser mit BackTracking geschrieben, der ist zwar ein bisschen Chaotisch, weil ich zum Schluss einiges ausprobiert habe, mit Statusmaschine und so ein Zeug, funktioniert aber. Ich hatte für die jeweiligen Felder Strukturen angelegt, hier habe ich dann die Möglichkeiten für die Felder gespeichert.
    Sudokulöser sind eine gute Übung, auch wenn meiner von der Struktur her mittlerweile ziemlich verunglückt ist, konnte aber so sehen, wie man es oft nicht machen sollte, wenn Interesse besteht, kann ich den mal Posten, ist aber ziemlich groß.



  • du bist nicht zufälig an der HAW-Hamburg?
    Wir müssen genau das selbe machen 🙂

    greetz


Log in to reply